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

发布于 2024-12-10 08:25:18 字数 87 浏览 1 评论 0原文

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

遥远的她 2024-12-17 08:25:18

我会尽量不复制/粘贴 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.

偷得浮生 2024-12-17 08:25:18

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

来源

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.

source

携君以终年 2024-12-17 08:25:18

来自 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文