2010-01-28 61 views
6

說我有類似下面的查詢:JOIN的順序是否有所不同?

SELECT t1.id, t1.Name 
FROM Table1 as t1 --800,000 records 
INNER JOIN Table2 as t2 --500,000 records 
ON t1.fkID = t2.id 
INNER JOIN Table3 as t3 -- 1,000 records 
ON t1.OtherId = t3.id 

我會看到性能提升,如果我改變了我的加入對錶2和表3的順序。請看下圖:

SELECT t1.id, t1.Name 
FROM Table1 as t1 --800,000 records 
INNER JOIN Table3 as t3 -- 1,000 records 
ON t1.OtherId = t3.id 
INNER JOIN Table2 as t2 --500,000 records 
ON t1.fkID = t2.id 

我聽說查詢優化器將嘗試確定最佳的順序,但並不總是奏效。您使用的SQL Server版本是否有所作爲?

回答

6

連接順序沒有區別。

有什麼有所作爲是確保您的統計數據是最新的。

檢查統計數據的一種方法是在SSMS中運行查詢幷包含實際執行計劃。如果估計的行數與執行計劃的任何部分使用的實際行數非常不同,那麼您的統計數據會過期。

重建相關索引時重建統計信息。如果您的生產維護窗口允許,我會每晚更新統計數據。

這將更新統計信息數據庫中的所有表:

exec sp_MSforeachtable "UPDATE STATISTICS ?" 
+0

我該如何檢查?我應該多長時間更新一次我的統計資料是否有一個很好的經驗法則? – 2010-01-28 00:47:27

+0

實際執行計劃中是否包含預計和實際行?所以,如果它估計1行,它返回數千,那麼我可能需要更新我的統計數據?如果我加入臨時桌子,它會有所作爲嗎? – 2010-01-28 01:06:34

+0

另外,如果加入視圖,統計是否會有所作爲? – 2010-01-28 01:22:34

1

查詢優化器應該很容易處理這些是完全一樣的查詢,並制定出這樣做的最佳方式。

大部分是關於統計的記錄數量。例如,如果t1.fkID中的絕大多數值是相同的,則此信息可能會影響QO。

3

僅當您指定OPTION (FORCE ORDER)時,連接順序纔會有所不同。否則,優化器將以它認爲最有效的方式重新排列您的查詢。

實際上,在某些情況下,我發現我需要使用FORCE ORDER,但它們當然很少。如果您不確定,只需要SET STATISTICS [TIME|IO] ON並親自體驗。在大多數情況下,如果不是所有情況,您都可能發現版本運行速度比優化版本慢。

相關問題