CTE是否使用tempdb中的任何空间,还是仅使用内存?
我用mssql 2005和2008标记了这个问题,因为我同时使用它们。
答案 0 :(得分:11)
我会尝试不复制/粘贴MSDN
没关系。
CTE独立于查询执行:它只是一种语言结构。可以把它想象为整齐的派生表或子查询。
这意味着除了递归CTE(见后文),所有 CTE都可以内联编码。如果您使用CTE代码一次,那么它是可读性。如果你使用CTE两次或更多次,那么它就是防御性的:你不想犯错,每次使用时派生表都不同。
如果CTE使用两次或更多次,则该代码将执行两次或更多次。它不会被执行一次并缓存在tempdb中。
摘要:它可能会也可能不会,就像代码是内联的一样。
注意:recursve CTE只是派生表内部派生表内派生表内的派生表...所以同样适用。
您可以在Tony Rogerson's article中看到这一点。如果内联编码,无论如何都会使用tempdb。他还指出,由于我在上面解释的“宏观”扩展,使用临时表会更好
仅供参考:同样适用于观点。只是宏。
答案 1 :(得分:8)
可以将公用表表达式视为临时结果集 在单个SELECT,INSERT的执行范围内定义, UPDATE,DELETE或CREATE VIEW语句。当查询计划为 公用表表达式查询使用假脱机运算符进行保存 在中间查询结果中,数据库引擎创建工作表 在tempdb中支持此操作。
答案 2 :(得分:4)
来自MSDN:http://msdn.microsoft.com/en-us/library/ms345368.aspx
公用表表达式可以被认为是在单个SELECT,INSERT,UPDATE,DELETE或CREATE VIEW语句的执行范围内定义的临时结果集。
当公用表表达式查询的查询计划使用假脱机运算符来保存中间查询结果时,数据库引擎会在tempdb中创建工作表以支持此操作。