我有一个包含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)
答案 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不准确。但我希望你能在上述基础上得到这个想法。