我有一些看起来像这样的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.
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我可以在执行计划中看到它似乎在CTE中运行查询,基本上每次引用CTE.如果我改为创建临时表#InterestingObjects并使用它,当然,它运行一次查询,将结果放入临时表,然后查询.在我的特定实例中,这使整个事情运行得更快.
我的问题是:这总是我对CTE的期望(不是以任何方式记住结果,就像它在任何地方内联查询一样?)是否有理由说SQL Server无法更好地优化它?通常我对优化器有多聪明感到敬畏,但我很惊讶它无法解决这个问题.
(编辑:BTW,我在SQL Server '08 R2上运行它.)