CTE是否使用tempdb中的任何空间?

deu*_*uid 11 sql-server-2005 tempdb common-table-expression sql-server-2008

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

我用mssql 2005和2008标记了这个问题,因为我同时使用它们.

gbn*_*gbn 11

我会尽量不复制/粘贴MSDN

没关系.

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

这意味着除了递归CTE(见下文),所有 CTE都可以内联编码.如果您使用CTE代码一次,则为了便于阅读.如果你使用CTE两次或更多次,那么它就是防御性的:你不想犯错,每次使用时派生表都不同.

如果CTE使用两次或更多次,则该代码将执行两次或更多次.它不会被执行一次并缓存在tempdb中.

摘要:它可能会也可能不会,就像代码是内联的一样.

注意:recursve CTE只是派生表内部派生表内派生表内派生表的派生表...所以同样适用.

你可以在Tony Rogerson的文章中看到这一点.如果内联编码,无论如何都会使用tempdb.他还指出,由于我上面解释的"宏观"扩展,使用临时表会更好

仅供参考:同样适用于观点.只是宏.

  • 如果您没有意识到它正在使用 tempdb,那么在运行 CTE 时,带有 tempdb 的驱动器就会耗尽空间,这很重要。 (2认同)

Joe*_*Joe 9

可以将公用表表达式视为在单个SELECT,INSERT,UPDATE,DELETE或CREATE VIEW语句的执行范围内定义的临时结果集.当公用表表达式查询的查询计划使用假脱机运算符来保存中间查询结果时,数据库引擎会在tempdb中创建工作表以支持此操作.

资源


Ada*_*ger 5

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

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

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