删除查询确实很慢 - 对于大量数据

时间:2011-06-07 13:39:23

标签: sql sql-server

我有一个包含2400万用户数据的数据库,我想在所有表格中均匀地清除23/24的数据。

删除语句花费数小时,我可以做些什么来提高这些查询的效率:

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)

4 个答案:

答案 0 :(得分:5)

如果您打算只保留数据的1/24,则可以更快地将数据选择到其他位置,截断原始表并将其复制回来。

如果关键约束/操作约束阻止了这种情况,那么你应该将删除批量删除成每个删除数千行,例如每次删除10k行并循环该命令,以避免一个非常大的事务(这是什么正在发生一个删除语句。)

答案 1 :(得分:1)

如果可以,请考虑在执行删除之前删除未使用的索引和密钥。 更新索引的时间可能相当大。 完成后不要忘记重新创建索引。

答案 2 :(得分: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是一个任意选择的数字,对各种尺寸进行一些测试,看看什么最适合你的桌子。)

答案 3 :(得分: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不准确。但我希望你能在上述基础上得到这个想法。