Postgresql

如何預測 VACUUM FULL 將回收多少空間?

  • November 5, 2020

有沒有辦法提前確定VACUUM FULL特定表上的磁碟空間將返回給作業系統?因此,您可以決定這樣做是否值得。

如果有一個簡單的查詢可以為數據庫/伺服器中的每個表執行此操作(而不是單獨執行每個表),則獎勵。

您需要pgstattuple擴展才能獲得可用空間量。

所以你可以跑

SELECT t.oid::regclass AS table_name,
      s.table_len AS size,
      dead_tuple_len + s.approx_free_space AS reclaimable
FROM pg_class AS t
  CROSS JOIN LATERAL pgstattuple_approx(t.oid) AS s
WHERE t.relkind = 'r'
ORDER BY (s.dead_tuple_len::float8 + s.approx_free_space::float8)
      / (s.table_len::float8 + 1.0) DESC;

wheresizereclaimableare 以字節為單位。

請注意,此查詢有些昂貴。

這應該可以很好地估計可以回收的空間,但實際上它會稍微少一些,因為

  1. 每個 8kB 塊中總是有一些空閒空間太小而無法容納另一行
  2. 如果您有長時間執行的事務,一些死元組可能無法回收

引用自:https://dba.stackexchange.com/questions/279232