2011-08-25 150 views
0

可能重複:
SQL JOIN: is there a difference between USING, ON or WHERE?SQL查詢優化

考慮一下,如果我有一個名爲A和B兩個表,一個有2萬行和B只有100行,當我使用這些SELECT聲明,我需要知道這兩個區別

SELECT A.C1, B.C1 
FROM A, B 
WHERE A.C1 = B.C2 

第二個是

SELECT A.C1, B.C1 
FROM A 
INNER JOIN B ON A.C1 = B.C2 

我在看性能水平,我需要知道這個之間的核心區別。當我和我的同事談話時,他告訴我第一個問題是交叉加入會降低性能,但我不是那樣想的。

請幫忙。

哪個查詢你在這裏建議,爲什麼?

回答

9

性能沒有任何區別。第一個是而不是交叉連接,因爲它似乎是有效的WHERE子句。

唯一的區別是第二個遵循ANSI-92標準。我個人更喜歡使用第二個符合ANSI的查詢,但這真的取決於您。

還可以閱讀:ANSI vs. non-ANSI SQL JOIN syntax

+0

+1是,**總是**使用第二個版本 - 具有JOIN條件的'INNER JOIN'更清晰。另外:使用第一個(遺留)JOIN語法,您總是有忘記指定連接條件(您必須)的危險可能性,因此最終會產生不需要的笛卡爾積... –

+1

我以爲它們都是ANSI 。 ANSI 89與ANSI 92至少這是我從以前關於這個主題的問題中得到的結果...... –

+0

對於內部連接,這兩種語法都是從SQL92開始的ANSI標準。 –

3

我會建議第二個查詢,因爲它看起來更好,反映了你的數據庫邏輯。大多數(如果不是全部的話)SQL服務器爲兩者生成完全相同的查詢計劃,因此性能應該相同。

+0

反映你的數據庫邏輯手段? –

+0

這意味着它反映了數據庫邏輯,因爲where條件在邏輯上不是真正的「過濾器」,而是連接條件。 – TomTom

0

正如大家都知道,有一個SQL查詢執行的各個階段。首先執行的是From子句,然後將結果集傳遞給Where子句,然後Select子句僅從Where子句最終返回的一組行中選擇所提到的字段。

在第一種情況下,交叉連接確實被創建並存儲在內存中,然後這些記錄被傳遞給Where子句。這意味着即使結果集中存在不符合條件的記錄。所以佔用的內存量更大。

在第二種情況下,From子句只保留匹配條件的記錄並將結果集傳遞給Where子句。很容易看到記錄數量會相當少。

從A中選擇,B是一個非常古老的構造,僅保留用於不可避免的情況。 Join條款已被引入以獲得更好的性能,並且肯定是首選。

希望這有助於:)

+0

我真的很期待這個..請你分享一些有力的證據來證明這一點嗎?我打算辯論.. :) –

+0

你有什麼記錄嗎? –

+0

-1這是一個平坦的謊言。 – NullUserException