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

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

Barbara Streisand
發布: 2025-01-10 19:01:41
原創
704 人瀏覽過

Is Using

SQL INNER JOINOR:效能瓶頸

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

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
登入後複製

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

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
登入後複製

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

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

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

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
登入後複製

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

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

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

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

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板