哪个SQL语句更有效连接或存在
问题描述:
我有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)
声明与“存在”,似乎要快得多。
答
我的经验是,它是一种折腾。如果你在这两个表上有很好的索引(你需要一个带有productid,barcode和orderid的索引),我敢打赌这两个查询的性能大致相同。所以我会用你认为更容易阅读/维护的。
另外,如果您只是在查询以确定是否需要删除,那么您最好跳过选择并仅执行删除。如果没有东西需要删除,那么删除语句会发现并且什么都不会做。换句话说,如果发现需要删除的内容,执行选择需要您处理两次数据。相反,只做删除操作,而且无论如何你只会处理一次数据。
答
存在通常会更快。在加入必须考虑所有可能的比赛之后,它在找到第一场比赛后停止。
你可能想问你是否需要这样做,尽管如此。而不是删除行,您可能会更好地使用“where not exists ...”限制进行插入操作。如果您使用的是SQL Server 2008,则可以使用合并语句做得更好。
重复 - 在这里看到这个问题,例如:http://stackoverflow.com/questions/227037/can-i-get-better-performance-using-a-join-or-using-exists – 2009-08-13 19:47:42