2011-04-11 71 views
2

我正在使用SQL Server 2008-R2,我需要使用多個表連接。在這種情況下,使用WHERE語句或使用INNER JOIN和ON語句時哪個查詢具有更好的時間性能?這兩個語句在多個條件下使用AND運算符。在SQL中加入語句性能

我想知道是否也有一些相關的查詢調整這個問題。

對於上述選項的示例代碼:

1)

SELECT * 

FROM T1,T2,T3.... 

WHERE T1.ID = T2.ID AND 

     T1.ID = T3.ID AND 

     .... 

2)

SELECT * 

FROM T1 

    INNER JOIN T2 

     ON T1.ID = T2.ID 

    INNER JOIN T3 

     ON T1.ID = T3.ID 

    INNER JOIN ..... 

的Tx。

+0

可能重複的[SQL INNER JOIN問題](http://stackoverflow.com/questions/3412785/sql-inner-join-question) – 2011-04-11 08:02:21

回答

4

快速回答:不,性能沒有差異。

這是一個比較常見的問題,並且還有了說明:在SQL服務器INNER JOIN ON vs WHERE clause

查詢優化引擎會自動轉換這兩個查詢到相同的方法來檢索結果。

查詢性能的最大區別在於您的連接順序以及每次新連接過濾了多少數據。最有選擇性的連接語句(過濾出最多的結果)應該首先出現(儘可能取決於要加入的表)。

+0

連接順序只與FORCE ORDER查詢提示 – Magnus 2011-04-11 08:37:33

0

假設兩個語句在語法上都是相同的,您應該看到性能完全沒有區別 - 查詢優化器接受SQL語句並將其轉換爲查詢計劃,並且SQL的原始形式有點不相關。

99次100分之外,查詢優化程序完全正確地得到它 - 它曾經有可能混淆優化程序,但現代版本的SQL Server幾乎總能找到。

一般而言,我建議您儘可能簡單地理解您的查詢,如果您認爲您遇到問題,請評估性能,並且只在您確實需要時進行優化。

1

這兩者之間應該沒有性能差異,所以最好能與同一數據庫上的其他查詢保持一致。

如有疑問,請使用SQL Server Management Studio的「顯示實際執行計劃」來顯示兩個查詢的相對性能。 Query -> Include Actual Execution Plan

1

性能沒有差異。

但是,第一種樣式是ANSI-89,會讓你的腿在一些商店中斷。包括我的。第二種風格是ANSI-92,更清晰。

示例:

哪一個是JOIN,哪個是過濾器?

FROM T1,T2,T3.... 
WHERE T1.ID = T2.ID AND 
    T1.foo = 'bar' AND T2.fish = 42 AND 
    T1.ID = T3.ID 

FROM T1 
    INNER JOIN T2 ON T1.ID = T2.ID 
    INNER JOIN T3 ON T1.ID = T3.ID 
WHERE 
    T1.foo = 'bar' AND T2.fish = 42 

如果你有外連接(=**=),那麼第二個風格將工作作爲標榜。第一個最有可能不會,並且在SQL Server 2005 +中也被棄用

ANSI-92樣式更難以使用bollix。如果您錯過了一個條件,使用舊款式,您可以輕鬆地結束笛卡爾產品(交叉連接)。 ANSI-92會出現語法錯誤。