2009-08-13 54 views
0

我有2个表,orderData和stagingOrderData。我需要查看stagingOrderData中是否存在任何存在于orderData中的行,以便在导入之前从stagingOrderData表中删除它们。哪个SQL语句更有效连接或存在

测试案例 - 我尝试了加入

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) 

声明与“存在”,似乎要快得多。

+1

重复 - 在这里看到这个问题,例如:http://stackoverflow.com/questions/227037/can-i-get-better-performance-using-a-join-or-using-exists – 2009-08-13 19:47:42

回答

1

我的经验是,它是一种折腾。如果你在这两个表上有很好的索引(你需要一个带有productid,barcode和orderid的索引),我敢打赌这两个查询的性能大致相同。所以我会用你认为更容易阅读/维护的。

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

1

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

你可能想问你是否需要这样做,尽管如此。而不是删除行,您可能会更好地使用“where not exists ...”限制进行插入操作。如果您使用的是SQL Server 2008,则可以使用合并语句做得更好。