哪个SQL语句更有效的连接或存在

时间:2009-08-13 19:43:51

标签: sql-server

我有2个表,orderData和stagingOrderData。我需要查看stagingOrderData中是否存在orderData中存在的任何行,以便我可以在导入之前从stagingOrderData表中删除它们。

测试用例 - 我尝试了一个连接

select * from 
dbo.stagingOrderData s
inner join dbo.OrderData o
on s.productid = o.productid
and s.barcode = o.barcode
and s.orderid = o.orderid

然后和“存在”

select * from 
dbo.stagingOrderData s
where exists(dbo.OrderData o
select * from 
    where o.productid = s.productid
and o.barcode = s.barcode
and o.orderid = s.orderid )

“存在”的陈述似乎要快得多。

2 个答案:

答案 0 :(得分:1)

存在通常会更快。在找到第一场比赛之后,它会在连接必须考虑所有可能的匹配之后停止。

你可能想问一下你是否需要这样做。您可能最好不要使用“where not exists ...”限制执行插入操作,而不是删除行。如果您使用的是SQL Server 2008,那么使用合并语句可以做得更好。

答案 1 :(得分:1)

我的经验是,这是一个折腾。如果你对两个表有很好的索引(你需要一个带有productid,条形码和orderid的索引),我敢打赌这两个查询的表现大致相同。所以我会使用你认为更容易阅读/维护的那些。

另外,如果您所做的只是查询以确定是否需要删除,那么最好不要跳过选择并只删除。如果没有要删除的内容,delete语句将发现该内容并且不执行任何操作。换句话说,如果您发现需要删除任何内容,执行选择需要您处理数据两次。相反,只执行删除操作,无论如何都只处理数据。