首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在Sql数据仓库中,CTE的性能比临时表要好得多?

为什么在Sql数据仓库中,CTE的性能比临时表要好得多?
EN

Stack Overflow用户
提问于 2019-12-12 02:50:12
回答 1查看 37关注 0票数 0

我想从一个大表(大约1千亿行)中选择数据,该表将id与从json传入数据创建的表进行匹配。

下面是我首先做的事情:

代码语言:javascript
复制
SELECT * 
#JsonIds 
FROM OPENJSON(CONVERT(VARCHAR(MAX), '[{"id": "18897126"},{"id": "710990568"},{"id": "610990568"},{"id": "510990568"}]')) 
WITH (id BIGINT); 

SELECT * 
FROM #jsonIds j 
INNER JOIN [schema].[myBigTable] t ON t.id = j.id

这一点表现得很糟糕。差不多花了3分钟才完成!

经过几次尝试,我决定看看CTE的表现如何:

代码语言:javascript
复制
WITH JsonIds AS 
( 
    SELECT *     
    FROM OPENJSON(CONVERT(VARCHAR(MAX), '[{"id": "18897126"},{"id": "710990568"},{"id": "610990568"},{"id": "510990568"}]')) 
    WITH (id BIGINT) 
)  
SELECT p.* 
FROM [schema].[myBigTable] p 
inner join JsonIds j on p.id = j.id

令我惊讶的是,CTE做得好多了。花了不到一秒钟的时间。

为什么CTE在这样一个简单的查询上表现得如此之好?

EN

回答 1

Stack Overflow用户

发布于 2019-12-12 09:35:55

尝试向临时表添加统计数据:

代码语言:javascript
复制
SELECT * 
INTO #JsonIds 
FROM OPENJSON(CONVERT(VARCHAR(MAX), '[{"id": "18897126"},{"id": "710990568"},{"id": "610990568"},{"id": "510990568"}]')) 
WITH (id BIGINT); 

CREATE STATISTICS StatId on #JsonIds (id);

SELECT * 
FROM #jsonIds j 
INNER JOIN [schema].[myBigTable] t ON t.id = j.id

自动创建统计数据不会在临时表上发生。所以Azure DW可能对临时表的内容做了错误的假设。

如果上述方法都不起作用,那么尝试在每个语句之前加上单词EXPLAIN,并在问题中包含生成的XML解释计划,这样我们就可以看到它在做什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59292225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档