我有一个巨大的表,其中正在进行大量删除。 我时不时地通过执行下面的命令来清理表以将一些空间恢复到系统中
VACUUM FULL VERBOSE ANALYSE table_name
我知道 autovacuum 应该可以完成这项工作,但随着时间的推移,我看不到任何空间使用量的减少。 全真空显然是一个相当漫长的过程,有时我意识到这不值得付出努力,因为我只恢复了免费演出。其他时候我可以得到十几个空间
所以我想知道是否有任何方法可以在 Postgres 中检查在进行任何操作之前可以将多少空间释放回操作系统/哪些表需要清理
我使用的是12版本。
**** 编辑****
简而言之,我需要粗略估计吸尘后可以收回的浪费空间。
我不确定“释放回操作系统”。
但是为了粗略估计浪费的空间,我会这样做:
SELECT
schemaname , relname ,
pg_total_relation_size(relid) AS total_size,
n_live_tup , n_dead_tup ,
n_dead_tup * 100.0 /
CASE n_live_tup WHEN 0 THEN 1 ELSE n_live_tup END AS dead_ratio,
pg_total_relation_size(relid)::numeric * n_dead_tup / CASE n_live_tup WHEN 0 THEN 1 ELSE n_live_tup END AS wasted_space
FROM
pg_catalog.pg_stat_all_tables
WHERE
schemaname = 'public'
ORDER BY
wasted_space DESC;
架构名称 | 相关名称 | 总大小 | n_live_tup | n_dead_tup | 死亡比率 | 浪费空间 |
---|---|---|---|---|---|---|
公开 | 页面提取 | 409575424 | 92428 | 5831 | 6.3086943350499849 | 25838861 |
公开 | 注释_类型 | 761856 | 1 | 6 | 600.0000000000000000 | 4571136 |
公开 | doc_dflt | 38010880 | 15789 | 1120 | 7.0935461397175249 | 2696319 |
公开 | 页 | 215359488 | 215567 | 1650 | 0.76542327907332755014 | 1648411 |
公开 | 文件 | 17784832 | 12995 | 1027 | 7.9030396306271643 | 1405542 |
逻辑:
当然这是一个非常粗略的估计,实际结果会有所不同。