我有一些看起来大致像这样的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上运行它。)

最佳答案

CTE的好坏取决于所使用的方式(涉及递归,索引等概念)。您可能会发现这篇文章很有趣:http://www.sqlservercentral.com/articles/T-SQL/2926/

09-27 02:48