with ini as
(
select ...
)
select ini.a
join ini.b
join ini.c
SQL Server引擎calculate
表ini
表的結果有多少次?CTE能提高性能嗎?
我試圖回答(在您的幫助下)我的問題是如果with
聲明(CTE)通過aliasing
結果提高性能。
with ini as
(
select ...
)
select ini.a
join ini.b
join ini.c
SQL Server引擎calculate
表ini
表的結果有多少次?CTE能提高性能嗎?
我試圖回答(在您的幫助下)我的問題是如果with
聲明(CTE)通過aliasing
結果提高性能。
CTE ini只是一個擴展的宏,這個用法僅僅是語法/清晰。 MSDN說:
使用CTE提供提高可讀性的優點,並緩解維護複雜的查詢
一無所知的性能。
它被評估爲每提到:因此您可以從執行計劃中看到三次。
對於遞歸的CTE它有點不同,因爲CTE建立在本身,但它仍然會每提及一次評價
甲CTE(公共表表達式,即包在「與」的部分)基本上是一個1次視圖。如果你從臨時角度考慮它,也許答案會變得更加清晰。據我所知,解釋器只是簡單地將CTE內的任何內容拷貝/粘貼到主要查詢中,無論它在哪裏找到引用。
我確定有外部的情況下它似乎有幫助,但更多的時候,我認爲只是CTE本身的存在不會改善查詢的性能。這將有助於在單個select語句中的可讀性和可重用性(即,您不必重複鍵入相同的子查詢多次),但我不相信它會神奇地讓事情運行得更快(所有的事情都是平等)。當然,如果你的查詢在CTE中的結構與在子查詢中完全不同,那麼CTE很可能在那時運行得更快,但你現在正在比較蘋果和橙子。
我想這也取決於你是否用它來代替派生表或相關的子查詢。如果你加入到CTE中,性能將在第一種情況下大致相同,而在第二種情況下性能可能會明顯好一些,而不是僅僅參考CTE替換了suquery代碼。如果你用它來替換一個帶有左連接的NOT EXISTS子句給CTE(爲了在一個表中找到記錄而不是另一個),我認爲性能會更糟,因爲Where Exists通常是緊固方式做這種類型的任務。我想我要說的是,性能仍然取決於你如何使用CTE,而不僅僅是你生成了一個。
你的意思是3個計時器在這裏... theres 3 joins –