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