2011-07-29 146 views
1
with ini as 
(
    select ... 
) 
select ini.a 
join ini.b 
join ini.c 

SQL Server引擎calculateini表的結果有多少次?CTE能提高性能嗎?

我試圖回答(在您的幫助下)我的問題是如果with聲明(CTE)通過aliasing結果提高性能。

回答

2

CTE ini只是一個擴展的宏,這個用法僅僅是語法/清晰。 MSDN說:

使用CTE提供提高可讀性的優點,並緩解維護複雜的查詢

一無所知的性能。

它被評估爲每提到:因此您可以從執行計劃中看到三次。

對於遞歸的CTE它有點不同,因爲CTE建立在本身,但它仍然會每提及一次評價

+0

你的意思是3個計時器在這裏... theres 3 joins –

1

甲CTE(公共表表達式,即包在「與」的部分)基本上是一個1次視圖。如果你從臨時角度考慮它,也許答案會變得更加清晰。據我所知,解釋器只是簡單地將CTE內的任何內容拷貝/粘貼到主要查詢中,無論它在哪裏找到引用。

我確定有外部的情況下它似乎有幫助,但更多的時候,我認爲只是CTE本身的存在不會改善查詢的性能。這將有助於在單個select語句中的可讀性和可重用性(即,您不必重複鍵入相同的子查詢多次),但我不相信它會神奇地讓事情運行得更快(所有的事情都是平等)。當然,如果你的查詢在CTE中的結構與在子查詢中完全不同,那麼CTE很可能在那時運行得更快,但你現在正在比較蘋果和橙子。

0

我想這也取決於你是否用它來代替派生表或相關的子查詢。如果你加入到CTE中,性能將在第一種情況下大致相同,而在第二種情況下性能可能會明顯好一些,而不是僅僅參考CTE替換了suquery代碼。如果你用它來替換一個帶有左連接的NOT EXISTS子句給CTE(爲了在一個表中找到記錄而不是另一個),我認爲性能會更糟,因爲Where Exists通常是緊固方式做這種類型的任務。我想我要說的是,性能仍然取決於你如何使用CTE,而不僅僅是你生成了一個。