CTE是否占用tempdb中的任何空间,还是仅使用内存?
我已经将问题标记为mssql 2005和2008,因为我都在使用这两个版本。
CTE是否占用tempdb中的任何空间,还是仅使用内存?
我已经将问题标记为mssql 2005和2008,因为我都在使用这两个版本。
我将尝试不复制粘贴MSDN。
这无关紧要。
CTE独立于查询执行: 它只是一种语言结构。可以将其视为漂亮的派生表或子查询。
这意味着,除了递归CTE(稍后再看),所有 CTE 都可以在代码内联编写。如果您只使用 CTE 代码一次,则是为了增强可读性 。如果您使用 CTE 两次或更多次,则是为了加强代码防御性 :您不希望出现误差并导致每次使用的派生表不同。
当一个 CTE 在多处使用时,该代码将被执行两次或多次。它不会被执行一次并缓存在tempdb中。
总结:与内联代码一样,CTE 可能会被执行多次或仅执行一次。
注意: 递归CTE只是一个嵌套派生表的派生表,以此类推。
您可以在Tony Rogerson的文章 中看到这一点。如果内联编写,将仍然使用tempdb。他还指出,使用临时表可能更好,因为我上面解释的“宏”扩展。
提示:相同的规则也适用于视图。只是一些宏而已。
来自MSDN:http://msdn.microsoft.com/en-us/library/ms345368.aspx
通用表达式可以被视为在单个SELECT、INSERT、UPDATE、DELETE或CREATE VIEW语句的执行范围内定义的临时结果集。
当通用表达式查询的查询计划使用溢出操作符来保存中间查询结果时,数据库引擎会在tempdb中创建一个工作表来支持此操作。