postgresql回收机制autovacuum

postgresql autovacuum

delete操作行不会立即从数据文件中删除,而是通过xmax字段将其标记删除
update操作可能在postgresql中被视为delete+insert

dead tuples
select schemaname,relname,n_dead_tup,
(case when n_live_tup>0 then n_dead_tup::float8/n_live_tup::float8
else 0 end) aa
from pg_stat_all_tables;
vacuum

用法1:vacuum tb_name
手动操作,扫描表并从表和索引中删除死元组,但是不会将磁盘空间返回到操作系统,而将用于新行,CPU和IO使用率升高

用法2:vacuum full table_name
将回收空间返回给操作系统,但会锁表(独占锁),阻止所有操作,如select。其次,实际是创建一个表的副本,使所需的磁盘空间加倍,同时复制表非常慢

analyze

analyze table_name
手动执行,效率差,每次执行时都是从头开始重建统计数据

autoanalyze:自动执行

autovacuum优点
1)清理死元组
2)更新优化程序规划查询时使用的数据分布统计信息
3)后台运行的维护任务,对用户查询的影响较小,消耗的CPU和IO也相对较小

autovacuum相关参数
##参看参数设置
select * from pg_settings where name like '%vacuum%';

autovacuum的工作成本

  • autovacuum_vacuum_cost_delay
  • autovacuum_vacuum_cost_limit

触发autovacuum的参数

  • autovacuum_vacuum_threshold:设置当表上的被更新的元组数的阈值
  • autovacuum_vacuum_scale_factor:设置表大小的缩放系数
  • autovacuum:是否启动系统自动清理功能,默认on
  • autovacuum_max_workers:设置系统自动清理工作进程的最大数量
  • autovacuum_naptime:设置两次系统自动清理操作之间的间隔时间
  • autovacuum_freeze_max_age:设置需要强制对数据库进行清理的XID上限值

触发条件
1.表上(update,delete记录)>=autovacuum_vacuum_scale_factor* reltuples(表上记录数) + autovacuum_vacuum_threshold

2.指定表上事务的最大年龄配置参数autovacuum_freeze_max_age,默认为2亿,达到这个阀值将触发 autovacuum进程,从而避免transaction wraparound

##查看表事务年龄
select relname,age(relfrozenxid) from pg_class where relname='tb_name';

a.可以单独设置每个表
alter table tb_name set with(参数设置值);

b.新创建表
create table tb_name(...) with(参数设置值);

c.可以关闭某个表的autovacuum功能
alter table tb_name set(autovacuum_enabled=false);

注意:
1.一般不建议单独设置,管理起来比较困难和复杂
2.autovacuum_max_workers数值设置建议为CPU核数/3。如果CPU资源充,I/O性能较好时,可以适当调大
3.autovacuum_freeze_max_age达到最大值可能出现的问题,如果冻结操作很慢,导致事务id耗尽,最终会导致数据库拒绝所有事务的执行,指导冻结操作结束。版本pg9.6之后对已经全部是冻结的行的数据块,不再进行冻结处理。
4.autovacuum_freeze_max_age不会等到到达这个限制之后才进行冻结,默认情况下,autovacuum_freeze_max_age*95%的事务数量时候开始进行冻结操作。

##查询每个表的xid使用程度
SELECT c.oid::regclass as tb_name, greatest(age(c.relfrozenxid),age(t.relfrozenxid)) as age 
FROM pg_class c 
LEFT JOIN pg_class t ON c.reltoastrelid = t.oid 
WHERE c.relkind IN ('r', 'm') 
order by age desc;

##查看当前数据库的autovacuum情况
SELECT schemaname, relname, n_live_tup, n_dead_tup, last_autovacuum
FROM pg_stat_all_tables
ORDER BY n_dead_tup/(n_live_tup* current_setting('autovacuum_vacuum_scale_factor')::float8+ current_setting('autovacuum_vacuum_threshold')::float8) DESC
LIMIT 10;

pg_stat_all_tables:记录当前数据库中所有表的统计信息

字段描述
relid表oid
schemaname模式名
relname表名
seq_scan表顺序扫描次数
seq_tup_read表顺序扫描返回行数
idx_scan索引扫描次数
idx_tup_fetch索引扫描返回行数
n_tup_ins插入行数
n_tup_upd更新行数,包含hot update
n_tup_del删除行数
n_tup_hot_upd热更新行数
n_live_tup活元组行数
n_dead_tup死元组行数
n_mod_since_analyze上次last analyzed修改的行数
last_vacuum上次执行vacuum的时间
last_autovacuum上次执行autovacuum的时间
last_analyze上次执行analyze的时间
vacuum_countvacuum的行数
autovacuum_countautovacuum的行数
analyze_countanalyze的行数
autoanalyze_countautoanalyze的行数

参考文档:
https://blog.csdn.net/kmblack1/article/details/84953517
https://www.sohu.com/a/287094621_505827
https://blog.csdn.net/liuhuayang/article/details/112211102

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值