首页 > 数据库 > mysql教程 > 为什么 INNER JOIN 中的'OR”条件如此慢?

为什么 INNER JOIN 中的'OR”条件如此慢?

Mary-Kate Olsen
发布: 2025-01-10 19:07:42
原创
607 人浏览过

Why Are

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板