2015-09-15 76 views
0
Way1: 
Select * from tableA inner join tableB 
on tableA.aid = tableB.aid 
where a.condA = xx 
AND a.condB = xx 
AND a.condC = xx 

Way2: 
Select * from tableA inner join tableB 
on tableA.aid = tableB.aid 
AND a.condA = xx 
AND a.condB = xx 
AND a.condC = xx 

從上面的語法判斷,術語或性能是否存在顯着差異?SQL WHERE or ON for join語句

+3

檢查執行計劃,非常簡單。查詢優化器也可以爲兩者生成相同的計劃,但一如既往。 – lad2025

+1

注意,如果您使用「left join」,兩個查詢的結果將會不同。 –

+0

您可以在查詢下拉列表中啓用執行計劃。運行查詢後,它會顯示每次完成操作的計算成本,以及將鼠標懸停在圖標上時的更詳細信息。 – jjjjjjjjjjj

回答

1

通常,DBMS應該生成相同的執行計劃。

我發現前者(JOIN語法)比後者更明顯,因爲它更清楚你正在做什麼。

+0

它也是一個ANSI標準形式(http://www.w3schools.com/ SQL/sql_quickref.asp) –

0

編號沒有區別。

它不會在INNER JOIN的情況下產生任何影響,無論是表現明智還是結果明智。

OUTER JOIN的情況下,條件的位置產生差異。

-1

就查詢的等價性而言,唯一真正重要的是外連接。在這些情況下,無論您是將標準置於聯合還是重要的地方。一個在外連接之前/期間應用,另一個在連接之後應用。因此,在需要將空值作爲外連接處理的情況下,可能會導致無實際連接。所以外連接的兩個查詢並不等同。

有時在內部連接中,如果條件會導致字段被轉換爲另一種類型,那將會很重要。如果是這種情況,可能會出現類型轉換問題,導致其無法正常工作。換句話說,如果你將一個整數列與一個字符串列進行比較,並且字符串列中包含'TEST',那麼你將會有一段糟糕的時間。除非您通過連接條件排除這些行。

就性能而言,您希望將條件放入連接中,以達到要使用的索引。除此之外,他們應該進入where子句,除非在連接中需要它們。

但是你的例子可能不是最好的。它看起來像針對特定值的特定字段的所有檢查。如果您的條件只是針對常量或變量檢查一個表中的值,則這些條件通常不用作連接條件。

0

它們應該生成相同的執行計劃,結果相同,使用示例1的優點是可讀性。在小型查詢中可以使用,但是隨着查詢變得越來越複雜,有一些可讀的東西是很好的,並且如果他們讀過你的代碼,那麼對你的同行來說是很好的。這就像格式化,每個人都喜歡整潔的代碼,易於閱讀。