13

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

我使用 mssql 2005 和 2008 都标记了这个问题。

4

3 回答 3

13

我会尽量不要复制/粘贴 MSDN

没关系。

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

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

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

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

注意:递归 CTE 只是派生表内的派生表内的派生表内的派生表内的派生表内的派生表......所以同样适用。

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

仅供参考:这同样适用于视图。只是宏。

于 2011-10-18T03:41:52.177 回答
11

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

来源

于 2011-10-18T03:03:09.113 回答
5

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

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

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

于 2011-10-18T03:03:31.630 回答