优化 SQL INNER JOIN
包含“OR”条件的查询:性能分析
最近 SQL Server 2008 查询中的性能瓶颈源于 OR
中的 INNER JOIN
条件。 原始查询涉及两个表(每个表仅包含 50,000 行),速度显着下降。
效率低下的查询使用了以下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>
这就提出了一个问题:是否应该避免 OR
子句中的 JOIN
条件?虽然并非普遍有害,但了解其性能影响至关重要。
核心问题在于优化器的限制。 具有 JOIN
条件的 OR
无法利用 HASH JOIN 或 MERGE JOIN 等优化连接方法。 该查询的逻辑本质上相当于使用 UNION
:
<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 优化器可能无法识别这种等价性,从而导致执行计划效率较低,尤其是对于较大的数据集。 相比之下,LEFT JOIN
方法允许优化器采用更有效的策略。 因此,虽然并不总是有问题,但应仔细考虑 OR
中的 JOIN
条件,并可能进行重构以获得最佳性能。
以上是如何使用'OR”条件优化 SQL INNER JOIN 查询以提高性能?的详细内容。更多信息请关注PHP中文网其他相关文章!