2016-03-17 19 views
5

我有2個表(table1 table2),table2比table1大。「加入」順序會導致不同的查詢性能

腳本1:

SELECT t1.A, t2.B 
FROM table1 AS t1 
JOIN table2 AS t2 ON t1.PK = t2.FK 

腳本2:

SELECT t1.A, t2.B 
FROM table2 AS t2 
JOIN table1 AS t1 ON t1.PK = t2.FK 

是否表現腳本#1會比劇本#2更好嗎?

+3

'SQL Server'根據成本生成執行計劃...所以回答 - 不。 – Devart

+1

內部連接是完全可交換的,只要沒有提示強制連接順序,優化器就會重新排列它們,因爲它看起來合適。 –

+4

我不明白在這個問題上upvotes。自己做一個非常簡單的測試 - 這麼容易,我甚至認爲是一個downvote。 –

回答

2

您正在使用一個INNER JOIN所以答案是NO

由於連接類型,這將產生完全相同數量的數據,並且您在兩個查詢中都加入了相同的關係,因此它們基本相同。

這本來是不同的,如果你已經從主(左)表保持使用LEFT JOIN,因爲在左連接,所有的數據,並從細節表中的所有匹配數據(右) 。

因此,如果您使用了左連接,並將較大的表放在左側,那麼查詢會產生更多數據,並且可能會比較慢,然後將較大的表放在右側。

2

應該創建相同的計劃。但是,如果您有大量連接混洗,連接順序可能會改變計劃,因爲處理這些連接的方式數量衆多。

Optimizing Join Orders

當然這只是針對內連接,外連接可能會返回不同的結果。順便說一句,優化器應該喜歡外連接,它大大減少了可能的連接次數:-)

2

內連接是可交換的,這意味着一個連接b = b連接a.Logical連接可能是內連接,但在執行計劃SQL可能會嘗試考慮嵌套循環,基於幾個參數的哈希或合併..沒有一個物理連接是壞的,每個都有自己的優勢。

您可以從側面注意一件事(最低限度),試着查看兩個連接列是否索引,sargabilty,沒有隱式轉換。