2011-06-07 51 views
0

我有一個數據庫的數據爲24百萬用戶,我想在所有表中均勻清除23/24的數據。刪除查詢真的很慢 - 爲大量的數據

的DELETE語句花費數小時,有什麼我可以做些什麼來改善這些查詢的效率:

delete from [feedback] where [key] %24<>0 and [key] not in (50697,9179, 19392753, 3780,14095, 455141,455144,1576550,719307706,10233,706507,315321,2998138,19275591,73037336,23371,11904062,08496,71959,79765,9969,02315,1850,666824,32289,826578,66284,718017,85204,192179,9406787,469844,9843,13801850,8575204,8927569) 
+0

可能是你可以添加在你的表格中填入一列,然後爲'不在'ID進行更新。可能是'%24 <> 0'。最後,你可以通過新創建的標誌。但如果你這樣做,不要使用'不在',而是使用平等。一個ID的查詢。 – ibram 2011-06-07 13:45:43

回答

5

如果您打算保留的數據中的1/24,這將是更快將數據選出到另一個位置,截斷原始表並將其複製回來。

如果關鍵約束/操作約束阻止了這一點,那麼您應該將刪除操作批量化爲每刪除1000行,例如每刪除10k行並循環該命令,以避免一個非常大的事務使用單個刪除語句發生了什麼)。

0

會以其他方式提供幫助嗎?

CREATE Table FeedBack2 AS 
SELECT * FROM Feedback 
WHERE Key % 24 = 0 
AND Key IN (50697,9179, 19392753, 3780,14095, 455141,455144,1576550,719307706,10233,706507,315321,2998138,19275591,73037336,23371,11904062,08496,71959,79765,9969,02315,1850,666824,32289,826578,66284,718017,85204,192179,9406787,469844,9843,13801850,8575204,8927569) 

TRUNCATE TABLE Feedback 

INSERT INTO Feedback 
SELECT * FROM Feedback2 

DROP Table Feedback2 

編輯:上面的SQL是不精確的。但是,我希望你會根據上面的想法得到這個想法。

+0

... WHERE密鑰%24 = 0 **或**密鑰輸入(50697,9179 ... – 2011-06-07 14:13:49

1

如果可以,請考慮在執行刪除操作之前刪除未使用的索引和鍵。 時間更新索引可能相當可觀。 不要忘記在完成後重新創建索引。

1

要做到這一點,可擴展的方式(即,無論多少數據或多少百分比的數據被刪除都無關緊要)是「刪除」刪除操作。 DELETE是一個記錄的操作,這意味着在行被實際刪除之前,它們首先被寫入到日誌文件中,並且對於2400萬行可能是一個相當大的寫入單個。這裏是基本的模板(未經測試,謹防錯別字):

DECLARE @HowManyLastTime int 

SET @HowManyLastTime = 1 

WHILE @HowManyLastTime <> 0 
BEGIN 
    DELETE top (10000) 
    from [feedback] where [key] %24<>0 and [key] not in (50697,9179, 19392753, 3780,14095, 455141,455144,1576550,719307706,10233,706507,315321,2998138,19275591,73037336,23371,11904062,08496,71959,79765,9969,02315,1850,666824,32289,826578,66284,718017,85204,192179,9406787,469844,9843,13801850,8575204,8927569) 

    SET @HowManyLastTime = @@rowcount 
END 

(10000是隨機選取的號碼,做各種尺寸的一些測試,看看有什麼最適合你的表。)

+0

我明白了,但僅供參考'DELETE top 10000'不是有效的語法 – Dan 2011-06-08 10:49:40

+1

我站好了!括號已經被添加了,這樣做會和SQL 2005和更高版本一起工作,但是(我相信)在SQL 2000或更早版本中不起作用。 – 2011-06-08 13:48:09