Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 CTE是否使用tempdb中的任何空间?_Sql Server 2005_Sql Server 2008_Common Table Expression_Tempdb - Fatal编程技术网

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

Sql server 2005 CTE是否使用tempdb中的任何空间?,sql-server-2005,sql-server-2008,common-table-expression,tempdb,Sql Server 2005,Sql Server 2008,Common Table Expression,Tempdb,CTE是否使用tempdb中的任何空间,还是仅使用内存 当我同时使用mssql 2005和2008时,我已经将这个问题标记为mssql 2005和2008 可以将公共表表达式视为临时结果集 在单个SELECT、INSERT、, 更新、删除或创建视图语句。当查询计划 公共表表达式查询使用假脱机运算符保存 在查询结果中间,数据库引擎创建一个工作表 在tempdb中,以支持此操作 来自MSDN: 公共表表达式可以看作是在单个SELECT、INSERT、UPDATE、DELETE或CREATE VIEW

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

当我同时使用mssql 2005和2008时,我已经将这个问题标记为mssql 2005和2008

可以将公共表表达式视为临时结果集 在单个SELECT、INSERT、, 更新、删除或创建视图语句。当查询计划 公共表表达式查询使用假脱机运算符保存 在查询结果中间,数据库引擎创建一个工作表 在tempdb中,以支持此操作

来自MSDN:

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


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

我将尝试不复制/粘贴MSDN

没关系

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

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

如果CTE使用两次或两次以上,则该代码将执行两次或两次以上。它不会执行一次并缓存在tempdb中

总结:它可能是也可能不是,就像代码是内联的一样

注:递归CTE只是一个派生表中的派生表中的派生表中的派生表中的派生表中的派生表中的派生表。。。同样的道理也适用

你可以从中看到这一点。如果以内联方式编码,则无论如何都会使用tempdb。他还指出,使用临时表会更好,因为我在上面解释了“宏”扩展


仅供参考:视图也是如此。只有宏。

中肯定会提到查询。请参阅下面关于“查询所需的空间”的部分。如果您没有意识到它正在使用tempdb,那么这很重要。。。然后,在运行CTE时,带有tempdb的驱动器会耗尽空间。