2010-09-08 174 views
2

這是從DeletedProducts表中刪除在ProductFileInfo表中找不到引用的最有效方法嗎?SQL Server 2005:刪除優化

樣品:

DELETE FROM DeletedProducts 
WHERE ProductId NOT IN SELECT DISTINCT ProductID FROM ProductFileInfo 

還是NOT EXIST執行此更好的方法。

注意:ProductFileInfo有超過2000萬條記錄。

SQL Server 2005標準是我正在使用的。

謝謝

+0

如果您發佈(T-SQL)代碼或XML,請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼」按鈕(101 010)以良好地格式化和語法突出顯示它! – 2010-09-08 16:36:06

回答

3

不在和不存在可能會產生相同的計劃。你要刪除多少行?如果是很多,我會做的5K或10K這樣批你不會有一個大的交易填補你的日誌,然後如果失敗不管出於什麼原因,它需要做一個大的回滾段

例如

DELETE top 5000 
from sometable 
where .... 
go 100 --will be executed 100 times 

爲了GO N到工作,你需要SSMS和Service Pack 2(IIRC),但當然你也可以寫一個while循環.. while @@rowcount > 0 .......

-1

這是一個很好的資源正是你的要求。

http://www.sql-server-performance.com/tips/t_sql_where_p3.aspx

+0

我看了第一個幾個技巧,他們看起來非常可疑(也許他們曾經是真的,但他們對SQL Server 2005+是不正確的) – 2010-09-08 16:40:13

+0

對你而言,這是非常不公平的,這是由一個備受尊敬的社區作者編寫的,而且我最近在2周前看到過其他受尊敬的主持人對其中的多個部分進行了多次演示。 – user404463 2010-09-08 17:09:30

+0

@daytona - Brad McGehee的名字也是如此,我有點驚訝。我想知道他是否在前一段時間寫了這段代碼,而其他人則更新了它,說它適用於SQL2005。在SQL 2005+中,雖然[Not In vs Not Exists](http://sqlinthewild.co.za/index.php/2010/02/18/not-exists-vs-not-in/)和[In vs Exists] (http://sqlinthewild.co.za/index.php/2009/08/17/exists-vs-in/)。自己做一些實驗。如果你發現任何不同,讓我知道! – 2010-09-08 17:15:08

0

嘗試多種解決方案,並測試其性能,因人而異。 也可以嘗試外連接

DELETE FROM DeletedProducts d left outer join ProductFileInfo p 
on d.ProductId = p.ProductId WHERE p.ProductID is null 
0

嗯,我通常寫沿

delete d 
from TableToDeleteFrom d 
where not exists(select top 1 1 from SomeOtherTable sot where sot.ThatId = d.ThatId) 

線的東西也許,你不想要鎖定的查找表,以便您可以指定with(readpast)提示或with(nolock)