2009-08-24 85 views
1

在SQL Server中,我想知道是否有這樣做的(A)之間的性能差異...SQL Server的性能選擇使用連接

SELECT a.field1, a.field2, a.field3, b.field1 
FROM table1 a INNER JOIN table2 b ON a.IDfield = b.IDfield 

這(B)...

SELECT a.field1, a.field2, a.field3, b.field1 
FROM table1 a, table2 b 
WHERE a.IDfield = b.IDfield 

那麼,這是一個簡單的例子。我正在處理大約4個連接,我一直在做例子B,這是不是一個壞習慣?我認爲寫作會更好,閱讀更好,但如果性能更差,就不會再做了。當然,我不能做左連接,就這樣加入,但在我正在做的查詢中並不是這樣。謝謝。

+2

簡單的答案是分析它。 – rein 2009-08-24 05:46:02

+0

@rein - 同意!直到你分析它,你纔會知道。我見過一些他們表現不同的案例。 – Kirtan 2009-08-24 05:48:38

回答

6

不,沒有區別 - 因爲最終兩個查詢都是a.IDfield = b.IDfield標準的表A和B之間的INNER JOIN。

但是,查詢(A)是表達意圖的首選方式 - 在編寫新查詢時始終使用此樣式!這也是ANSI SQL標準中描述的風格 - 所以只要有可能,最好使用這種風格。

Marc

+1

顯示的B語法在某些時候不被支持。所以習慣於寫A版本。在某些情況下(我不記得是什麼),B語法可以產生不同的結果。我認爲這與正確的連接有關。 – mrdenny 2009-08-24 13:03:46

+0

@MDDENny:好點 - 還有一個很好的理由不開始習慣這種語法! :-) – 2009-08-24 14:25:29

1

根據我的經驗,我會說這取決於!

SQL Server Optimizer是一個真正的神祕的東西。理想情況下,兩種語法沒有區別;但實際上,您應該使用JOIN關鍵字,正如Marc所說。

根據運行時情況,SQL Server Optimizer MAY使第二個查詢運行得比第一個查詢快,反之亦然。這完全取決於。您可以使用查詢執行計劃REALLY確定哪個查詢性能最佳。

+0

我不認爲這取決於這種情況 - 在這兩種情況下,都有一個簡單而直接的標準(a.IDfield = b.IDfield),並且兩者都是直接內部聯接。 – 2009-08-24 05:44:28

+1

你是對的,他們都是一樣的。但是,通常,查看查詢執行計劃以查看哪個查詢性能更好的更好的做法是。 – Kirtan 2009-08-24 05:47:01

+0

同意 - 但這個例子太容易了,甚至不必去查看一個執行計劃:-) – 2009-08-24 05:48:17

1

我絕不會使用第二種語法。當你有大量的連接時,它很容易發生意外的交叉連接。首先是維護更清晰。與該樣式一起使用的左右連接語法在SQl Server中無法正常工作,並且正在停止使用。

在我看來,使用第二種語法是非常糟糕的做法。而且只有17年過時了。

1

與其他所有事情相同(相同的db,相同的索引,相同的統計信息,MDOP設置),性能方面在兩個查詢中沒有區別。

你可以通過執行看到:

SET SHOWPLAN_TEXT ON GO

SELECT a.field1,a.field2,a.field3,b.field1FROM table1的一個INNER JOIN表2 b在a.IDfield = b.IDfield GO

SELECT a.field1,a.field2,a.field3,b.field1FROM table1的一個,表2 bWHERE a.IDfield = b.IDfield GO

執行後的上述你西港島線我看到兩個查詢的執行計劃確實是相同的。

或者,您可以突出顯示管理工作室中的語句,右鍵單擊並選擇「包含實際執行計劃」以查看同一事物的圖形表示。