2010-07-26 28 views
6

我有一些SQL看起來大致是這樣的:性能特點的CTE

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上運行此)

+0

Stackoverflow用戶Quassnoi http://stackoverflow.com/users/55159/quassnoi在這寫了一篇有趣的文章。 http://explainextended.com/2009/05/28/generating-xml-in-subqueries/ – 2010-07-26 15:20:44

+0

這很有趣。我沒有像他描述的那樣受到任何限制(例如,經歷了一個不允許臨時表的ORM),所以我不明白他的方法爲什麼比臨時表更好 - 顯然如果你硬編碼一個計劃像這樣,當你改變查詢時,這是一個很大的維護成本。儘管如此,對於執行計劃如何控制這種行爲仍然是非常有用的觀點。 – alphabasic 2010-07-26 15:24:05

回答