2014-02-05 63 views
0

Shuold我使用INNER JOIN條件作爲WHERE條件? 考慮這兩個示例查詢來解釋這個問題:SQL:Shuold我使用INNER JOIN條件作爲WHERE條件?

SELECT t1.*, t2.* 
FROM table1 AS t1 
INNER JOIN table2 AS t2 
    ON t1.id = t2.foreign_key 
WHERE t1.year < 2014 

,這沒有WHERE條款

SELECT t1.*, t2.* 
FROM table1 AS t1 
INNER JOIN table2 AS t2 
    ON t1.id = t2.foreign_key 
     AND t1.year < 2014 

由於聯接類型INNER,這兩個查詢將導致典型的結果集。

哪種性能更好?

+0

謝謝@Sergio的整潔編輯..不知道如何 – rahmanisback

+0

[INNER JOIN ON vs WHERE子句]的可能重複(http://stackoverflow.com/questions/1018822/inner-join-on-vs- where-clause) – rahmanisback

回答

0

由於兩個查詢都應以相同的方式執行(如果查詢優化器是好的),所以性能應該相似。

我通常使用WHERE子句,因爲有簡單的連接條件確保索引掃描將被使用(如果有適當的索引)。

對於eaxample如果您有小幅的查詢修改(見條件順序):

SELECT t1.*, t2.* 
FROM table1 AS t1 
INNER JOIN table2 AS t2 
    ON t1.year < 2014 
     AND t1.id = t2.foreign_key 

一些優化引擎可以決定不上t2.foreign_key列使用索引。

+0

有趣。假設在t2.foreign_key上有一個索引,並且在t1.year上沒有索引,那麼引擎可以有效地翻轉這兩個條件的順序,利用索引來限制結果,並且只對其他結果集進行掃描(年)條件,而不是表掃描。 – rahmanisback

0

請嘗試檢查您的查詢計劃,應該接近相同。另外,數據庫引擎可以優化查詢以獲得更好的執行計劃,所以應該沒有區別