CTE可以提高性能吗?

时间:2011-07-29 13:32:11

标签: sql sql-server tsql

with ini as
(
    select ... 
)
select ini.a 
join ini.b 
join ini.c

SQL Server引擎calculate来自ini表的结果有多少次?

我正在尝试回答的问题(在您的帮助下)是with语句(CTE)通过aliasing结果提高了效果。

3 个答案:

答案 0 :(得分:2)

CTE ini只是一个扩展的宏,这种用法只是语法/清晰度。 MSDN说:

  

使用CTE具有提高可读性和易于维护复杂查询的优势

关于表现没什么。

每次提及评估:所以你可以在执行计划中看到三次。

对于递归CTE,它有点不同,因为CTE建立在自身上,但每次提到它仍然会被评估一次

答案 1 :(得分:1)

CTE(公用表表达式,包含在“with”中的部分)本质上是一次性视图。如果你从临时观点来看,也许答案会变得更加明确。据我所知,解释器只需将CTE中的任何内容复制/粘贴到主查询中,只要它找到引用即可。

我确信有外部实例似乎有所帮助,但通常情况下,我认为仅仅存在CTE本身并不会改善查询的性能。它将有助于单一选择语句中的可读性和可重用性(即,您不必多次重新键入相同的子查询),但我不相信它会神奇地使事情运行得更快(所有的事情都是平等)。当然,如果您的查询在CTE中的结构与您在子查询中的结构不同,那么CTE很可能在此时运行得更快,但您现在正在将苹果与橙子进行比较。

答案 2 :(得分:0)

我想这也取决于你用它来替换派生表或相关子查询。在第一种情况下,性能大致相同,如果你加入CTE,第二种情况可能要好得多,而不是仅仅用CTE引用替换suquery代码。如果你用它来替换一个带有左连接到一个CTE的NOT EXISTS子句(为了在一个表中找到记录而不是另一个表中的记录),我希望性能更差,因为Where Exists通常是紧固方式做那种任务。我想我所说的是性能仍然取决于你如何使用CTE,而不仅仅是你生成的CTE。