首頁 >資料庫 >mysql教程 >在 INNER JOIN 條件中使用「OR」是否總是對 SQL 效能不利?

在 INNER JOIN 條件中使用「OR」是否總是對 SQL 效能不利?

Barbara Streisand
Barbara Streisand原創
2025-01-10 19:01:41650瀏覽

Is Using

SQL INNER JOINOR:效能瓶頸

最近的效能最佳化工作突顯了一個重要問題:在 OR 條件中使用 INNER JOIN 運算子。 以下查詢舉例說明了這個問題:

<code class="language-sql">SELECT mt.ID, mt.ParentID, ot.MasterID
FROM dbo.MainTable AS mt
INNER JOIN dbo.OtherTable AS ot ON ot.ParentID = mt.ID OR ot.ID = mt.ParentID</code>

這個查詢被證明很慢。 使用 LEFT JOIN 顯著提高的性能重寫它:

<code class="language-sql">SELECT mt.ID, mt.ParentID,
   CASE WHEN ot1.MasterID IS NOT NULL THEN ot1.MasterID ELSE ot2.MasterID END AS MasterID
FROM dbo.MainTable AS mt
LEFT JOIN dbo.OtherTable AS ot1 ON ot1.ParentID = mt.ID
LEFT JOIN dbo.OtherTable AS ot2 ON ot2.ID = mt.ParentID
WHERE ot1.MasterID IS NOT NULL OR ot2.MasterID IS NOT NULL</code>

修改後的查詢在幾秒鐘內執行,這是一個實質性的改進。 這引起了人們對 ORJOIN 條件下的一般使用的擔憂。

為什麼 JOIN 中的 OR 可能會很慢

核心問題是 OR 條件中的 JOIN 會阻止 SQL Server 最佳化器利用高效的 HASHMERGE 連線。這些最佳化的連接方法通常對於快速查詢執行至關重要。 OR 條件阻止伺服器辨識查詢與兩個單獨的等值連線的等價性:

<code class="language-sql">SELECT *
FROM maintable m
JOIN othertable o ON o.parentId = m.id
UNION
SELECT *
FROM maintable m
JOIN othertable o ON o.id = m.parentId</code>

這會迫使 SQL Server 選擇效率較低的執行計劃,從而導致效能下降。

最佳實務:在 OR 條件下避免 JOIN

雖然沒有嚴格禁止,但在 OR 條件下使用 JOIN 通常會阻礙最佳化並導致效能下降。 對於多個連接條件,單獨的等值連接(如上面所示的 LEFT JOINUNIONLEFT JOINCASE 語句)通常可以提供卓越的效能。 這使得查詢優化器能夠利用其最有效的演算法。

以上是在 INNER JOIN 條件中使用「OR」是否總是對 SQL 效能不利?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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