Postgres批量删除数据

当需要对一些不需要的历史数据进行大批量删除时, 在使用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

 

转载于:https://my.oschina.net/u/3267498/blog/3085219

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值