在删除一个拥有将近2000万条记录的表时,用简单的delete操作,发现即使只是删除几万条数据都要很长的运行时间,可能的原因我猜想大概有:(1)每一条记录的delete操作都会在数据库日志中加以记录;(2)表上的索引重建也导致比较耗时的操作。
在参考网上的一些建议之后,并根据实际情况:(1)确定要删除的数据并不打算做日志回滚;(2)通过减少数据量后重建索引或许速度并不见得慢多少。因此决定采用truncate table来操作。
具体方法如下:
(1)复制出需要保留的数据:
select * into table2 from table1 where id>100000;
(2)用truncate table删除原表中的数据,使用truncate table时,将删除表中的所有行,而不记录单个行删除操作。TRUNCATE TABLE 通过释放用于存储表数据的数据页来删除数据,并且在事务日志中只记录页释放。因而效率很高。
truncate table table1;
(3)回写保留下来的数据
insert into table1 select * from table2
(4)删除临时数据表
drop table table2