【问题标题】:Performance characteristics of T-SQL CTEsT-SQL CTE 的性能特征
【发布时间】:2011-03-21 03:35:18
【问题描述】:

我有一些大致如下所示的 SQL:

with InterestingObjects(ObjectID, OtherInformation, Whatever) as (
    select X.ObjectID, Y.OtherInformation, Z.Whatever
    from X join Y join Z -- abbreviated for brevity
)

-- ...long query follows, which uses InterestingObjects in several more CTEs,
-- and then uses those CTEs in a select statement at the end.

当我运行它时,我可以在执行计划中看到,基本上每次引用 CTE 时,它似乎都在运行 CTE 中的查询。如果我改为创建一个临时表 #InterestingObjects 并使用它,当然,它会运行一次查询,将结果放入临时表中,然后从那时起进行查询。在我的特定例子中,这让整个事情运行得更快。

我的问题是:这是否总是我对 CTE 的期望(不以任何方式记忆结果,就像它在各处内联查询一样?)SQL Server 无法更好地优化它是否有原因?通常我对优化器的聪明程度感到敬畏,但我很惊讶它无法解决这个问题。

(编辑:顺便说一句,我在 SQL Server '08 R2 上运行它。)

【问题讨论】:

  • 这很有趣。我没有像他描述的那样在任何约束下操作(例如,通过不允许临时表的 ORM)所以我真的不明白为什么他的方法比临时表更好——显然如果你硬编码一个计划像这样,当您更改查询时,这是一个很大的维护成本。不过,对于执行计划如何控制这种行为来说,这是一个非常有用的视图。

标签: sql-server performance tsql query-optimization


【解决方案1】:

CTE 的优劣取决于它们的使用方式(涉及递归、索引等概念)。你可能会觉得这篇文章很有趣:http://www.sqlservercentral.com/articles/T-SQL/2926/

【讨论】:

    猜你喜欢
    • 2012-05-31
    • 2021-02-04
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    相关资源
    最近更新 更多