怎么防止postgres数据膨胀

本文详细介绍了如何通过配置autovacuum、调整触发阈值、增加工作内存、优化事务设计、使用大块数据、定期回收表以及选择合适的开发工具来提升PostgreSQL数据库的性能。包括设置autovacuum参数、避免长事务、关闭不必要的垃圾回收操作、调整autovacuum_naptime参数等关键点。
 
1. 一定要开启autovacuum。
2. 提高系统的IO能力,越高越好。
3. 调整触发阈值,让触发阈值和记录数匹配。调小autovacuum_vacuum_scale_factor和autovacuum_analyze_scale_factor。比如我想在有1万条垃圾记录后就触发垃圾回收,那么对于一个1000万的表来说,我应该把 autovacuum_vacuum_scale_factor调到千分之一即0.001,而 autovacuum_analyze_scale_factor应该调到0.0005。
4. 增加autovacuum_max_workers,同时增加autovacuum_work_mem,同时增加系统内存。
例如对于有大量表需要频繁更新的数据库集群,可以将 autovacuum_max_workers调整为与CPU核数一致,并将 autovacuum_work_mem调整为2GB,同时需要确保系统预留的内存大于 autovacuum_max_workers* autovacuum_work_mem。
5. 应用程序设计时,尽量避免持有事务Exclusive锁的长事务(DDL,DML都会持有 事务Exclusive锁
6. 对于IO没有问题的系统,关闭autovacuum_vacuum_cost_delay。
7. 调整autovacuum_naptime参数到最低,如果还是唤醒时间太长,可以调整代码中的限制,例如改为1毫秒:
#define MIN_AUTOVAC_SLEEPTIME 1.0               /* milliseconds */
8. 应用程序设计时,避免使用大批量的更新,删除操作,可以切分为多个事务进行。
9. 使用大的数据块,对于现代的硬件水平,32KB是比较好的选择,fillfactor实际上不需要太关注,100就可以了,调低它其实没有必要,因为数据库总是有垃圾,也就是说每个块在被更新后实际上都不可能是满的。
10. 万一真的膨胀了,可以通过table rewrite来回收(如vacuum full, cluster),但是需要迟排他锁。建议使用pg_reorg或者pg_repack来回收,实际上用到了交换 filenode可以缩短需要持有排他锁的时间。

转载于:https://my.oschina.net/u/2339776/blog/467258

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值