CTE 是否使用 tempdb 中的任何空间?
CTE 是否使用 tempdb 中的任何空间,还是仅使用内存?
我用 mssql 2005 和 2008 标记了这个问题,因为我同时使用这两者。
Do CTEs use any space in tempdb or does it use memory exclusively?
I've tagged the question with both mssql 2005 and 2008 as I use both.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我会尽量不复制/粘贴 MSDN
没关系。
CTE 独立于查询执行:它只是一种语言构造。将其视为简洁的派生表或子查询。
这意味着除了递归 CTE(见下文)之外,所有 CTE 都可以内联编码。如果您使用一次 CTE 代码,则是为了提高可读性。如果您使用 CTE 两次或更多次,那么它是防御性的:您不想犯错误并让每次使用的派生表都不同。
如果 CTE 使用两次或多次,则该代码将被执行两次或多次。它不会执行一次并缓存在 tempdb 中。
摘要:可能会也可能不会,就像代码是否内联一样。
注意:递归 CTE 只是 der 内的派生表内的派生表内的派生表内的派生表...因此同样适用。
您可以在 托尼·罗杰森的文章。如果内联编码,无论如何都会使用 tempdb。他还指出,由于我在上面解释的“宏”扩展
(仅供参考),使用临时表可能会更好:这同样适用于视图。只是宏。
I'll try not to copy/paste MSDN
It doesn't matter.
A CTE is independent of query execution: it is only a language construct. Think of it as neat derived table or subquery.
This means that except for recursive CTEs (see later), all CTEs can be coded inline. If you use the CTE code once, it is for readability. If you use the CTE twice or more, then it is defensive: you don't want to make a mistake and have the derived table different each use.
Where a CTE is used twice or more, then that code will be executed twice or more. It won't be executed once and cached in tempdb.
Summary: it may or may not, just like if the code was inline.
Note: a recursve CTE is simply a derived table inside a derived table inside a derived table inside a a derived table inside a der... so same applies.
You can see this in Tony Rogerson's article. The use of tempdb would happen anyway if coded inline. He also notes that using a temp table can be better because of the "macro" expansion I explained above
FYI: the same applies to views. Just macros.
来源
source
来自 MSDN: http://msdn.microsoft.com/en-us/library/ ms345368.aspx
公用表表达式可以被认为是在单个 SELECT、INSERT、UPDATE、DELETE 或 CREATE 的执行范围内定义的临时结果集查看声明。
当公用表表达式查询的查询计划使用假脱机运算符保存中间查询结果时,数据库引擎会在 tempdb 中创建一个工作表来支持此操作。
From MSDN: http://msdn.microsoft.com/en-us/library/ms345368.aspx
A common table expression can be thought of as a temporary result set that is defined within the execution scope of a single SELECT, INSERT, UPDATE, DELETE, or CREATE VIEW statement.
When the query plan for a common table expression query uses a spool operator to save intermediate query results, the Database Engine creates a work table in tempdb to support this operation.