【问题标题】:How does the WITH statement store the record set for the select query?WITH 语句如何存储选择查询的记录集?
【发布时间】:2010-06-24 08:50:21
【问题描述】:

考虑以下 SQL (SQL Server 2008) 语句:

WITH MyResult AS
(
  SELECT 
    Name,
    Row_ID AS ORD
  FROM Person Where Gender = @Gender
)
SELECT *
FROM MyResult
WHERE ORD > 5

MyResult 是否存储在 tempdb 的临时表中?还是做其他事情?

我们正在优化一些查询,并希望更好地理解 WITH 语句(内部)以帮助衡量性能等。

谢谢

【问题讨论】:

    标签: sql-server-2008 with-statement


    【解决方案1】:

    不,根据this MSDN article

    ...CTE 是语言级别的 构造——意味着 SQL Server 确实 不在内部创建临时或虚拟 表...

    还有,as mentioned here:

    公用表表达式 (CTE) 可以是 被认为是一个临时的结果集 在执行中定义的 单个 SELECT、INSERT 的范围, 更新、删除或创建视图 陈述。 CTE 类似于 派生表,因为它不存储 作为一个对象,只持续 查询的持续时间。

    【讨论】:

    • "...一个临时结果集..." 引发了我们的想法,即临时结果集被临时存储在某个地方(即 tempdb)
    • @Russell - 是的,我可以看到这里的措辞有点模糊。 SQL Server 本身使用 CTE,不会创建临时表。当然,就像任何查询(CTE 或无 CTE)一样,可以根据发生的情况将其分页到 tempdb。但这并不特定于 CTE
    猜你喜欢
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多