首页 > 数据库 > mysql教程 > 在 INNER JOIN 条件中使用'OR”是否总是对 SQL 性能不利?

在 INNER JOIN 条件中使用'OR”是否总是对 SQL 性能不利?

Barbara Streisand
发布: 2025-01-10 19:01:41
原创
710 人浏览过

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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板