建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
请选择 进入手机版 | 继续访问电脑版
设置昵称

在此一键设置昵称,即可参与社区互动!

确定
我再想想
选择版块
092947bevjlmiytnwwd8ky.jpg 【乘风破浪赋能学习季】2020华为云AI实战营,华为专家带你免费学AI! 2020年华为云AI实战营 华为云普惠AI
标签
您还可以添加5个标签
  • 没有搜索到和“关键字”相关的标签
  • 云产品
  • 解决方案
  • 技术领域
  • 通用技术
  • 平台功能
取消

彩虹上的水瓶座

发帖: 62粉丝: 21

级别 : 版主

发消息 + 关注

发表于2020年06月29日 21:20:10 493 1
直达本楼层的链接
楼主
显示全部楼层
[博文鉴赏] 如何减少或避免PostgreSQL数据膨胀

1. 一定要开启autovacuum

2. 提高系统的IO能力,越高越好。

3. 调整触发阈值,让触发阈值和记录数匹配。调小autovacuum_vacuum_scale_factorautovacuum_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. 应用程序设计时,尽量避免如下:

5.1 LONG SQL(包括查,增,删,改,DDL所有的SQL),

5.2 或者打开游标后不关闭,

5.3 或者在不必要的场景使用repeatable readserializable事务隔离级别,

5.4 或者对大的数据库执行pg_dump进行逻辑备份(隐式repeatable read隔离级别的全库备份),

5.5 或者长时间不关闭申请了事务号的事务(增,删,改,DDLSQL)。

6. 对于IO没有问题的系统,关闭autovacuum_vacuum_cost_delay

7. 调整autovacuum_naptime参数到最低(但是也要慎重,比如有长事务导致某些垃圾无法回收时,会不断的唤醒VACUUM WORKER去扫描垃圾页,然后发现无法回收,循环往复,浪费IOCPU。比如本地有LONG SQL或者STANDBY开启了feedback并有LONG SQL时,都是问题。参考 PostgreSQL物理"备库"的哪些操作或配置,可能影响"主库"的性能、垃圾回收、IO波动》 ),如果还是唤醒时间太长,可以调整代码中的限制,例如改为1毫秒:

#define MIN_AUTOVAC_SLEEPTIME 1.0               /* milliseconds */ 

8. 应用程序设计时,避免使用大批量的更新,删除操作,可以切分为多个事务进行。

9. 使用大的数据块,对于现代的硬件水平,32KB是比较好的选择,fillfactor实际上不需要太关注,100就可以了,调低它其实没有必要,因为数据库总是有垃圾,也就是说每个块在被更新后实际上都不可能是满的。

10. 万一真的膨胀了,可以通过table rewrite来回收(vacuum full, cluster),但是需要迟排他锁。建议使用pg_reorg或者pg_repack来回收,实际上用到了交换 filenode可以缩短需要持有排他锁的时间。

GaussDB for DWS可以借鉴

举报
分享

分享文章到朋友圈

分享文章到微博

彩虹上的水瓶座

发帖: 62粉丝: 21

级别 : 版主

发消息 + 关注

发表于2020年06月29日 23:41:59
直达本楼层的链接
沙发
显示全部楼层

gaussdb for dws内核基于postgres,可以参考使用

点赞 评论 引用 举报

游客

富文本
Markdown
您需要登录后才可以回帖 登录 | 立即注册