sqlserver 亿级数据删除方案
sqlserver 删除百万级别及以上数据的时候需要考虑是否需要保留日志文件,如果需要保留日志文件,用于恢复。那么就要使用DELETE语句进行删除,DELETE删除语句尽量使用主键或者索引的字段,
同时进行批量删除语句如下:
1 DECLARE @BatchSize INT 2 SET @BatchSize = 10000 -- 设置每批删除的记录数量 3 4 WHILE 1 = 1 5 BEGIN 6 DELETE TOP (@BatchSize) FROM YourTable 7 WHERE YourIDColumn IN (SELECT TOP (@BatchSize) YourIDColumn FROM YourTable) 8 IF @@ROWCOUNT < @BatchSize 9 BREAK 10 END
如果说不考虑恢复日志,那么可以对表数据直接清空,如果表id是自增truncate语句会使表id从1开始。
1 truncate table 表名称 -- 清空表
表清空后,磁盘空间可能不会完全释放,这是因为InnoDB 中采用了 B+ 树作为存储数据的结构,也就是常说的索引组织表。在InnoDB中,delete操作并不会真的删除数据,SQL Server实际上只是给要删除的数据打了标记,标记为删除。磁盘所占空间不会变小,即表空间并没有真正被释放。可以使用一下语句进行空间收缩。
DBCC SHRINKDATABASE ( 数据库名称 )
删除表的语句效率对比:
delete 表名称 where 删除条件 -- 删除数据,执行效率低 drop table 表名称 -- 删除表,效率一般 truncate table 表名称 -- 清空表,效率高
删除数据主要就是是否考虑恢复。选择合适自己业务场景的方式对数据库进行相应的操作。