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

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

在尝试提高极其缓慢的查询的速度时(如果重要的话,在 SQL Server 2008 上,在两个表上每个只有约 50,000 行的表上需要几分钟),我将问题范围缩小到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 通常是一个坏主意吗?或者我只是在表格布局上不走运?

最佳答案

这种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/5901791/

相关文章:

SQL Server 2008索引碎片问题

sql - 在 Power BI 中使用 DAX 进行左外连接(多对多关系)

sql - 我需要在我的 VB.net 程序中创建一个 CrossTab 查询来生成这个表

mysql - SQL 中类似枢轴的计算

c# - 如何在运行时从 .NET 应用程序更改 DTS 包中的连接字符串?

sql - 如何引用 sql 中紧接在组中另一条记录之前的记录?

sql - Postgres - 使用 PostGis 在 LINQ 或 SQL 中进行地理空间搜索

c# - Linq to SQL 与序列化

sql-server - "Error converting data type varchar to datetime"

sql - 我如何决定是否应该使用 CTE?