当需要对一些不需要的历史数据进行大批量删除时, 在使用delete语句时,会发现在删除一些数据时会非常慢
比如 DELETE FROM test where id < 10000;
删除缓慢的原因主要在于外键约束,当数据库在有约束的情况下,无论进行删除或者更新操作, 都会对相关表进行一个校验,判断相关表的相关记录是否被删除或者更新。 这个检查的过程会非常慢, 尤其在外建表又关联着外建表的这种层层嵌套的情况下。
解决方法:
ALTER TABLE test DISABLE TRIGGER ALL;
这样就会发现,删除的速度会大幅度上升, 之前对于操作过的嵌套表删除时,从几十分钟到1分钟以内,瞬间提速很多。
在删除完数据后, 一定要记得把trigger改回来, 调用:
ALTER TABLE test ENABLE TRIGGER ALL;
在删除完数据后,再重新对物理表进行一个优化
1. 使用vacuum(维护数据库磁盘的工具)删除那些已经被标记为删除的数据,并释放空间。但是vacuum工具不能对相应的索引进行清理,所以需要第二步重建索引
vacuum FULL test
2. 重新建立索引提高查询效率
REINDEX TABLE test