2010-06-11 42 views
3

我有3分表表1(與1020690個記錄),表2(有289425條記錄),表3(含83692條記錄)。我有這樣的事情最優順序(連接)左加入

SELECT * FROM Table1 T1 /* OK fine select * is bad when not all columns are needed, this is just an example*/ 
LEFT JOIN Table2 T2 ON T1.id=T2.id 
LEFT JOIN Table3 T3 ON T1.id=T3.id 

像這樣

SELECT * FROM Table1 T1 
LEFT JOIN Table3 T3 ON T1.id=T3.id 
LEFT JOIN Table2 T2 ON T1.id=T2.id 

查詢的查詢計劃讓我發現,它使用2合併連接兩者的連接。對於第一個查詢,第一個合併與T1和T2,然後是T3。對於第二個查詢,第一個合併與T1和T3,然後是T2。

這兩個查詢都需要大約相同的時間(約40秒),或者有時Query1需要幾秒鐘的時間。

所以我的問題是,聯接順序是否重要?

回答

3

像這樣的簡單查詢的連接順序應該沒有關係。如果有一種方法可以重新排序連接以提高性能,那麼這就是查詢優化器的工作。

理論上,你不應該擔心它 - 這就是SQL的重點。試圖超越查詢優化器通常不會給出更好的結果。特別是在MS SQL Server中,它具有非常好的查詢優化器。

我不希望這個查詢花費40秒。您可能沒有定義正確的索引。您應該使用諸如SQL Server ProfilerSQL Server Database Engine Tuning Advisor之類的工具來查看它是否可以推薦任何新的索引。

1

一般來說,SQL Server足夠聰明,可以挑選最佳的連接方式,它不僅會使用您在查詢中編寫的順序。也就是說,如果所有內部聯接都是第一個,然後左側聯接,我發現理解複雜查詢更容易。

2

查詢優化器將使用表上收集的約束,索引和統計信息的組合來構建執行計劃。在大多數情況下,這很有效。但是,我偶爾會遇到執行計劃選擇不當的情況。通常,調整查詢可以有效地強制優化器選擇更好的計劃。儘管如此,我不能提供一般的規則。當一切都失敗時,您可以使用FORCE ORDERquery hint

是的,連接順序可能會對查詢的執行時間產生重大影響。這個想法是,通過加入產生最小結果的表首先會導致更快地計算下一個連接。 編輯:然而,重要的是要注意,在FORCE ORDER的絕對值和所有其他條件相同的情況下,您在查詢中指定的順序可能與優化程序構建執行計劃的方式不相關。