sql - 在 INNER JOIN 条件下有一个 'OR' 是个坏主意吗?

标签 sql sql-server sql-server-2008 tsql inner-join

为了提高非常慢的查询的速度(在两个表上花费几分钟,每个表只有约 50,000 行,如果重要的话,在 SQL Server 2008 上),我将问题缩小到 OR在我的内部连接中,例如:

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

我将其更改为(我希望是)一对等效的左连接,如下所示:
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

.. 查询现在运行大约一秒钟!

放置 OR 通常是个坏主意吗?在加入条件?或者我只是在我的 table 布局方面不走运?

最佳答案

这种JOIN不可优化为 HASH JOINMERGE JOIN .

它可以表示为两个结果集的串联:

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的优化器不够聪明,无法在您编写的查询中看到它(尽管它们在逻辑上是等效的)。

关于sql - 在 INNER JOIN 条件下有一个 'OR' 是个坏主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9082769/

相关文章:

sql - 表的每一行都有sql语句。我如何按顺序运行每个?

sql-server - 查看加入存储过程结果

mysql - 更新内部查询结果

java - derby 数据库在 where 条件下的问题

sql - BLOB 和 CLOB 的解释

sql - 如何在 SQL Server 中按 YEAR-MM 对 DATE 字段进行分组?

mysql - 在 WHERE 子句中确定 CaseSensitive

mysql - 很简单的数据库设计题

java - 在java中获取数据库连接

sql - 此查询如何创建逗号分隔列表 SQL Server?