Sql server 哪一条SQL语句更有效

Sql server 哪一条SQL语句更有效,sql-server,Sql Server,我有两个表,orderData和stagingOrderData。我需要查看orderData中是否存在stagingOrderData中的任何行,以便在导入之前从stagingOrderData表中删除它们 测试用例-我尝试了一个连接 select * from dbo.stagingOrderData s inner join dbo.OrderData o on s.productid = o.productid and s.barcode = o.barcode and s.order

我有两个表,orderData和stagingOrderData。我需要查看orderData中是否存在stagingOrderData中的任何行,以便在导入之前从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
然后是“存在”


带有“exists”的语句似乎要快得多。

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


你可能想问一下,你是否需要这样做。与其删除行,不如使用“where not exists…”限制进行插入。如果您使用的是SQL Server 2008,那么通过使用merge语句,您可以做得更好。

我的经验是,这是一个难题。如果您对这两个表有很好的索引(您需要一个包含productid、barcode和orderid的索引),我敢打赌这两个查询的执行效果大致相同。所以我会使用你认为更容易阅读和维护的任何东西。
另外,如果您所做的只是查询以确定是否需要删除,那么最好跳过select而只执行删除。如果没有要删除的内容,delete语句将发现这一点,并且不会执行任何操作。换句话说,如果您发现需要删除任何内容,则执行select操作需要您对数据进行两次处理。相反,只执行删除操作,无论发生什么情况,您都只会处理一次数据。

重复-请参见此处的问题,例如:
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 )