在尝试提高极其缓慢的查询的速度时(如果重要的话,在 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 JOIN
或MERGE 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/