为了提高超慢查询的速度(如果有关系,请在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
联接条件通常不是一个好主意吗?还是我只是不幸地布置了桌子?
6
向我们显示执行计划,而不是您的查询。
—
布林迪
似乎是一种奇怪的关系
—
森·冈萨雷斯
@Blindy:好主意。事实证明,执行计划仅显示了Quassnoi在下面提到的内容:第一个查询导致嵌套循环,而第二个查询则通过哈希联接完成。
—
ladenedge,2011年