【发布时间】:2011-08-19 14:19:02
【问题描述】:
在尝试提高极慢查询的速度(在两个只有约 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 置于连接条件中通常是个坏主意吗?还是我只是在我的桌子布局上不走运?
【问题讨论】:
-
向我们展示执行计划而不是您的查询。
-
看起来很奇怪的关系
-
@Blindy:好主意。事实证明,执行计划显示了 Quassnoi 在下面提到的内容:第一个查询导致嵌套循环,而第二个查询是通过哈希连接完成的。
标签: sql sql-server sql-server-2008 tsql inner-join