n_dead_tup, n_live_tup, coalesce(round(n_dead_tup * 100 / (case when n_live_tup + n_dead_tup = 0 then null else n_live_tup + n_dead_tup end ),2),0.00) as dead_tup_ratio from pg_stat_all_tables where 1=1 and n_dead_tup >= 10 order by dead_tup_ratio desc limit 10
select schemaname as "用户名",relname as "表名",n_dead_tup as "死元组数", (case when n_live_tup > 0 then n_dead_tup::float8/n_live_tup::float8 else 0 end) as "死/活元组的比例" from pg_stat_all_tables order by "死/活元组的比例" desc
4 个回复
nccloud
关注表的膨胀率
select schemaname||'.'||relname,
n_dead_tup,
n_live_tup,
coalesce(round(n_dead_tup * 100 / (case when n_live_tup + n_dead_tup = 0 then null else n_live_tup + n_dead_tup end ),2),0.00) as dead_tup_ratio
from pg_stat_all_tables
where 1=1
and n_dead_tup >= 10
order by dead_tup_ratio desc
limit 10
查看这个表的死亡tuple 、 现存tuple、del_tuple 以及 最新一次 自动vacuum时间
select*from pg_stat_all_tables where schemaname||'.'||relname ='myschema.o_ls_test'
每更新一次,n_dead_tup加1
每删除一次数据 n_live_tup 和 n_dead_tup 均加1
自动vacuum的执行直接由autovacuum参数值决定,默认值是on。
log_autovacuum_min_duration:默认值为-1,关闭vacuum的日志记录,配置为0表示记录autovacuum的所有log。参数设置为正整数表示对于在此时间内完成的vacuum操作不进行log记录,如果没能完成,则记录超出时间内的log。该参数对于了解对象执行vacuum操作的时间非常有用。
autovacuum_max_workers:最大的autovacuum进程的数量,默认值为3。参数大小的配置主要依据系统当前负载和资源。对于系统负载较重的情况,建议开启少量的进程为好,反之,空闲时间可以采用较大值的方式。
autovacuum_naptime:检查数据库的时间间隔。默认为1分钟。
autovacuum_vacuum_threshold:参数表示执行autovacuum操作之前,对单个表中记录执行DML操作的最少行数。达到该行数时自动激活autovacuum操作。该参数针对数据库中的所有表,还可以通过对单个表配置不同的值来改变相应表的autovacuum操作。默认值是50。
autovacuum_analyze_threshold:激活自动analyze操作的最小行数。默认值50。机制与上面相同。
autovacuum_vacuum_scale_factor:该参数采用百分比的方式设定阀值。默认值为20%,当DML涉及的数据量大于某个表的20%时,自动触发autovacuum操作。同样可以通过对单个表进行阀值设定。
autovacuum_analyze_scale_factor:机制与上面相同,到达阀值是自动激活analyze操作。同样可以通过对单个表进行阀值设定。
autovacuum_freeze_max_age:为防止事务ID的重置,在启用vacuum操作之前,表的pg_class .relfrozenxid字段的最大值,默认为200万。
autovacuum_vacuum_cost_delay:autovacuum进程的时间延迟限制,默认值是20ms。对于单个表同样适用。
autovacuum_vacuum_cost_limit:autovacuum进程的开销延迟限制,默认值是-1,表示不进行开销限制,系统将会直接依据vacuum_cost_limit参数管理vacuum的开销。对于单个表同样适用。
nccloud
查询死元组数的情况
select schemaname as "用户名",relname as "表名",n_dead_tup as "死元组数",
(case when n_live_tup > 0 then
n_dead_tup::float8/n_live_tup::float8
else
0
end) as "死/活元组的比例"
from pg_stat_all_tables order by "死/活元组的比例" desc
nccloud
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 100;
nccloud
回收某个表的空间: vacuum full 表名