2011-10-31 55 views
0

哪個更好,帶有where子句的delete語句包含10,000個或過濾器(例如,從表中刪除id = 1或id = 2或id = 3等)或執行10,000個刪除語句(例如,從表中刪除id = 1;從表中刪除id = 2 ;,等等)?該數據庫是MS SQL Server。給定10,000個記錄ID,哪種方式是刪除記錄的正確方法?

編輯

ID是不連續的,並且沒有where子句我可以用它來捕獲所有這些(如其中id> 100和id < 50),因爲我不知道這些ID是如何相關的(除了它們都來自同一張表)。所以這真的是一個表現問題。

回答

2

對於性能,最差的方法是一次刪除一行。但是,一次刪除太多也會導致用戶鎖定和阻止問題。通常情況下,最好的辦法是兩次混合使用,一次刪除一批(約1000條記錄)。

現在,當您考慮被刪除的記錄可能在另一個表中存在子記錄時,這會變得更加複雜。有些人通過級聯刪除來執行刪除操作,其他人則從子表格開始操作。無論是哪種情況,都可能意味着您有超過10000條記錄需要刪除,然後爲了避免鎖定,批次需要更小。有些人可能希望在這種情況下一次執行一條記錄,以確保如果先前沒有刪除現有的子記錄,則其他記錄仍然無法識別,並且您知道哪些記錄失敗。對於兒童記錄的非常存在意味着你不應該貶低父母的記錄類型尤其如此(例如,你不能刪除實際購買東西的客戶,或者例如財務記錄全部搞砸了)。

+0

按批處理,好主意,謝謝你。 – enamrik

6

你從哪裏得到要刪除的ID?當然,有那麼多他們在某個地方的數據庫。如果是這樣的話,你做這樣的:

DELETE FROM MyTable 
WHERE ID IN (/* Select query that returns your 10000 IDs here */) 

如果他們在數據庫中卻沒有,添加它們,即使這意味着創建一個表來保存他們將只存在足夠長的時間來完成這個。

+0

問題是子查詢應該包含id = 1還是id = 2,最多爲10,000個id。 – enamrik

1

ID是否連續?如果是這樣,您可以運行以下SQL語句:

DELETE FROM table_name 
WHERE ID BETWEEN id_lowest and id_highest; 
+0

沒有ID不連續,請參閱編輯我的問題 – enamrik