SQL Server 2008 中 INNER JOIN 條件下使用 "OR" 導致效能問題的解析
一個針對兩張大約 5 萬行的小型表的緩慢查詢,經過 SQL Server 2008 資料庫專家的仔細檢查,找到了罪魁禍首:INNER JOIN 條件中的 "OR" 運算子。
問題程式碼片段如下:
<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>
將 "OR" 替換為一對 LEFT JOIN 後,查詢速度顯著提升,只需一秒鐘即可完成。
JOIN 條件中的 "OR" 是否是不良實務?
專家思考,在 JOIN 條件中使用 "OR" 是否總是不可取,或者他們的情況僅僅是由於特定的表結構導致的個例。
技術解釋
JOIN 條件中使用 "OR" 的問題在於,它無法被最佳化為 HASH JOIN 或 MERGE JOIN 操作。查詢最佳化器只能將其表示為不同結果集的合併:
<code class="language-sql">SELECT * FROM maintable m JOIN othertable o ON o.parentId = m.id UNION ALL SELECT * FROM maintable m JOIN othertable o ON o.id = m.parentId</code>
雖然每個單獨的結果集都是等值連接,但當存在 "OR" 時,優化器無法識別它們為等值連接。 這導致查詢效率低下。
以上是為什麼 INNER JOIN 中的「OR」條件如此緩慢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!