2009-08-13 47 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,則可以使用合併語句做得更好。