CTE(公用表达式)是否在tempdb中使用任何空间?

13

CTE是否占用tempdb中的任何空间,还是仅使用内存?

我已经将问题标记为mssql 2005和2008,因为我都在使用这两个版本。


查询内容可以在http://technet.microsoft.com/en-us/library/cc966545.aspx#EEAA中找到。同时请参考下面关于“查询所需空间”的部分。 - Mr Moose
3个回答

13

我将尝试不复制粘贴MSDN。

这无关紧要。

CTE独立于查询执行: 它只是一种语言结构。可以将其视为漂亮的派生表或子查询。

这意味着,除了递归CTE(稍后再看),所有 CTE 都可以在代码内联编写。如果您只使用 CTE 代码一次,则是为了增强可读性 。如果您使用 CTE 两次或更多次,则是为了加强代码防御性 :您不希望出现误差并导致每次使用的派生表不同。

当一个 CTE 在多处使用时,该代码将被执行两次或多次。它不会被执行一次并缓存在tempdb中。

总结:与内联代码一样,CTE 可能会被执行多次或仅执行一次。

注意: 递归CTE只是一个嵌套派生表的派生表,以此类推。

您可以在Tony Rogerson的文章 中看到这一点。如果内联编写,将仍然使用tempdb。他还指出,使用临时表可能更好,因为我上面解释的“宏”扩展。

提示:相同的规则也适用于视图。只是一些宏而已。


2
如果你没有意识到正在使用tempdb,那就很重要了...然后在运行你的CTE时,装有tempdb的驱动器空间用尽了。 - Paul Evans
注意,该文章的链接现在重定向到一个不安全的网站。 - Sam Krygsheld

11
通用表达式(CTE)可以被视为在单个SELECT、INSERT、UPDATE、DELETE或CREATE VIEW语句的执行范围内定义的临时结果集。当CTE查询的查询计划使用占位符运算符保存中间查询结果时,数据库引擎会在tempdb中创建一个工作表来支持此操作。 来源:source

5

来自MSDN:http://msdn.microsoft.com/en-us/library/ms345368.aspx

通用表达式可以被视为在单个SELECT、INSERT、UPDATE、DELETE或CREATE VIEW语句的执行范围内定义的临时结果集。

当通用表达式查询的查询计划使用溢出操作符来保存中间查询结果时,数据库引擎会在tempdb中创建一个工作表来支持此操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接