Postgresql
如何預測 VACUUM FULL 將回收多少空間?
有沒有辦法提前確定
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;
where
size
和reclaimable
are 以字節為單位。請注意,此查詢有些昂貴。
這應該可以很好地估計可以回收的空間,但實際上它會稍微少一些,因為
- 每個 8kB 塊中總是有一些空閒空間太小而無法容納另一行
- 如果您有長時間執行的事務,一些死元組可能無法回收