首頁 >資料庫 >mysql教程 >JOIN 查詢中的 WHERE 與 ON 子句:何時應使用 Which 以獲得最佳效能?

JOIN 查詢中的 WHERE 與 ON 子句:何時應使用 Which 以獲得最佳效能?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-04 09:58:35140瀏覽

WHERE vs. ON Clause in JOIN Queries: When Should I Use Which for Optimal Performance?

JOIN 查詢中的WHERE 子句與ON:效能影響

在T-SQL 中使用JOIN 查詢時,通常會遇到以下選擇:將篩選條件放在WHERE 子句或ON 子句中。雖然這兩種方法可以產生相同的結果集,但需要考慮細微的效能差異。

具體來說,讓我們檢查以下查詢:

SELECT *
FROM Foo f
INNER JOIN Bar b ON (b.BarId = f.BarId);
WHERE b.IsApproved = 1;

比較:

SELECT *
FROM Foo f
INNER JOIN Bar b ON (b.IsApproved = 1) AND (b.BarId = f.BarId);

兩個查詢會傳回相同的行集,但效能特徵不同。

一般來說,將過濾器放在ON 子句是首選,原因如下:

  • 最佳化聯接操作: ON 子句在聯接任何行先前進行評估,允許資料庫選擇性地僅聯接滿足條件的行指定的標準。這樣可以實現更有效率的連接過程。
  • 最小化結果集大小:透過在 ON 子句中進行過濾,可以減少接受 WHERE 子句評估的行數,從而導致可能會更小的結果集。

但是,在某些情況下,將過濾器放在WHERE 子句中是必要:

  • 外部聯接:外部聯結包括左表中的行,即使右表中沒有匹配的行也是如此。將篩選器放在 WHERE 子句中可讓您在連接發生後過濾結果集。
  • 可選過濾: 可選過濾器允許即使不滿足連接條件也返回行。例如,以下查詢要求b.IsApproved 為NULL 或1:
SELECT *
FROM Foo f
LEFT OUTER JOIN Bar b ON (b.BarId = f.BarId)
WHERE (b.IsApproved IS NULL OR b.IsApproved = 1);

結論:

當關注效能時,請考慮放置ON 子句中的篩選條件可最佳化聯結操作並減少結果集大小。對於外部連接或可選過濾,必須使用 WHERE 子句來實現所需的過濾。

以上是JOIN 查詢中的 WHERE 與 ON 子句:何時應使用 Which 以獲得最佳效能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn