2009-08-05 46 views
2

加入兩個表時,下面兩個塊之間有什麼區別,哪個更好?你寫了哪個SQL?

模式A:

SELECT ... 
FROM A 
    INNER JOIN B 
     ON A.PK = B.FK 
WHERE 1=1 
    AND A.Name = "Foo" 
    AND B.Title = "Bar" 

模式B:

SELECT ... 
FROM A 
    INNER JOIN B 
     ON A.PK = B.FK 
      AND B.Title = "Bar" 
WHERE 1=1 
    AND A.Name = "Foo" 
+2

我會認爲查詢優化器並不在乎;但我不是大師...... – balpha 2009-08-05 16:29:46

+0

@balpha:只適用於* INNER *連接。外部連接有區別。確切地說,是 – Sung 2009-08-06 05:09:08

回答

13

這將會從因人而異,但我認爲這一投資模式的比較好。

它所做的是將表級聯接與篩選器分開。這對於具有多個連接和多個過濾器的查詢會很有幫助,因爲它清楚地區分了正在進行的兩種連接類型。

+0

。 ON最初被引入以將過濾器的連接條件分開。 – Powerlord 2009-08-05 16:37:34

4

我更喜歡模式A,但可能沒有任何區別。爲了確保它能夠高效運行,您必須查看執行計劃。

0

我可能是錯的,但我認爲第一種方法更有效。你的查詢是從內到外執行的。所以當你首先運行你的連接時,它會跑得更快,只是因爲它必須匹配(可能是索引的)FK字段,而不是像你的標題字段(這可能是一個varchar,使匹配更慢)無關的任何東西。所以,當你到達你的過濾where子句時,你有更少的數據來執行匹配。總推測雖然。我不知道別人會說什麼。不會傷害看到這個執行計劃:)

+1

與良好的查詢引擎配對時,如何寫查詢不應與查詢的運行方式相關。對於較老的,不太聰明的查詢引擎,情況可能如此。 – 2009-08-05 16:45:32

3

如果您將INNER JOIN替換爲OUTER JOIN,將有所不同。

否則,這些查詢:

SELECT ... 
FROM A 
INNER JOIN 
     B 
ON  A.PK = B.FK 
WHERE A.Name = "Foo" 
     AND B.Title = "Bar" 

SELECT ... 
FROM A 
INNER JOIN 
     B 
ON  A.PK = B.FK 
     AND B.Title = "Bar" 
WHERE A.Name = "Foo" 

SELECT * 
FROM A, B 
WHERE B.Title = "Bar" 
     AND A.Name = "Foo" 
     AND A.PK = B.FK 

是相同的。

Oracle,MySQL,PostgeSQLSQL Server將對待他們完全一樣,並使用完全相同的計劃爲他們所有。如果在B.FK單列關鍵,而這一次

SELECT ... 
FROM A 
INNER JOIN 
     B 
ON  B.FK = A.PK 
WHERE A.Name = "Foo" 
     AND B.Title = "Bar" 

SELECT ... 
FROM A 
INNER JOIN 
     B 
ON  B.FK = A.PK 
     AND B.Title = "Bar" 
WHERE A.Name = "Foo" 

如果在(B.FK, B.title)複合鍵

我會用這一個。

在這種情況下,連接條件更直觀。

+0

如果你使用外部連接作爲第一種模式,將外部連接轉換爲內部連接,而第二種模式不會,那麼你對於存在差異是非常正確的,因此結果將會非常不同。 – HLGEM 2009-08-05 16:44:34

相關問題