PG表膨胀及对策

PG表膨胀及对策

检查表膨胀

方法一 查询pg_stat_all_tables系统表

SELECT

    schemaname||'.'||relname,

    n_dead_tup,

    n_live_tup,

    round(n_dead_tup * 100 / (n_live_tup + n_dead_tup),2) AS dead_tup_ratio

FROM

    pg_stat_all_tables

WHERE

    n_dead_tup >= 10000

ORDER BY dead_tup_ratio DESC

LIMIT 10;

 

方法2 使用pg_bloat_check工具

 `pg_bloat_check`会进行全表扫描,比`pg_stat_all_tables`准确,但比较慢对系统性能冲击也较大,不建议作为常规工具使用。

 

 

以上方法包含了对索引膨胀的检查。但需要注意的是,表中不能被回收的dead tuple在索引页里是作为正常tuple而不是dead tuple记录的。考虑到这一点,索引的实际膨胀要乘以对应表的膨胀率。

 

预防表膨胀

  1. 调整autovacuum相关参数,加快垃圾回收速度

对于写入频繁的系统,默认的autovacuum_vacuum_cost_limit参数值可能过小,尤其在SSD机器上,可以适当调大。

autovacuum_vacuum_cost_limit = 4000

  1. 监视并处理以下可能导致dead元组无法被回收的状况
  1. 长事务
  2. 未决事务
  3. 断开的复制槽
  1. 强制回收

设置old_snapshot_threshold参数,强制删除为过老的事务快照保留的dead元组。这会导致长事务读取已被删除tuple时出错。

old_snapshot_threshold = 12h

old_snapshot_threshold不会影响更新事务和隔离级别为RR只读事务。old_snapshot_threshold参数也不能在线修改,如果已经设置了old_snapshot_threshold但又需要运行更长的RR只读事务或单个大的只读SQL,可以临时在备机上设置max_standby_streaming_delay = -1,然后在备机执行长事务(会带来主备延迟)

  1. 杀死长事务

设置可以部分避免长事务的参数

idle_in_transaction_session_timeout = 60s

lock_timeout = 70s

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值