【发布时间】: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 上运行它。)
【问题讨论】:
-
Stackoverflow 用户 Quassnoi stackoverflow.com/users/55159/quassnoi 写了一篇有趣的文章。 explainextended.com/2009/05/28/generating-xml-in-subqueries
-
这很有趣。我没有像他描述的那样在任何约束下操作(例如,通过不允许临时表的 ORM)所以我真的不明白为什么他的方法比临时表更好——显然如果你硬编码一个计划像这样,当您更改查询时,这是一个很大的维护成本。不过,对于执行计划如何控制这种行为来说,这是一个非常有用的视图。
标签: sql-server performance tsql query-optimization