Postgres - 如何检查可以恢复多少 OS space

Postgres - how to check how much OS space can be recovered

我有一个很大的表,其中有很多 DELETE。 我不时清理表以通过执行以下

将一些 space 恢复回系统
  VACUUM FULL VERBOSE ANALYSE table_name

我知道 autovacuum 应该可以完成这项工作,但我看不到 space 随着时间的推移使用量减少。 Full Vacuum 这显然是一个相当漫长的过程,有时我意识到这不值得付出努力,因为我只恢复了 fre Gigs。其他时候我可以得到一打 space

所以我想知道是否有任何方法可以在 Postgres 中检查在进行任何操作之前可以将多少 space 释放回 OS/哪些表需要清理

我使用的是版本 12。

**** 编辑 ****

简而言之,我需要粗略估计浪费space我可以在吸尘后恢复。

我不确定“发布回 OS”。

但对于浪费的粗略估计 space 我会这样做:

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) * 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;
schemaname relname total_size n_live_tup n_dead_tup dead_ratio wasted_space
public page_extract 409575424 92428 5831 6.3086943350499849 25838861
public annotation_type 761856 1 6 600.0000000000000000 4571136
public doc_dflt 38010880 15789 1120 7.0935461397175249 2696319
public page 215359488 215567 1650 0.76542327907332755014 1648411
public file 17784832 12995 1027 7.9030396306271643 1405542

逻辑:

  • 获取死元组的比率
  • 乘以关系大小

当然这是一个非常粗略的估计,实际结果会有所不同。