Postgresql提供了pg_freespacemap扩展,默认系统没有这个扩展,需要去创建
创建extension
可以看到扩展有两个function:
查看单个table freespace
SELECT count(*) as "number of pages",
pg_size_pretty(cast(avg(avail) as bigint)) as "Av. freespace size",
round(100 * avg(avail)/8192 ,2) as "Av. freespace ratio"
FROM pg_freespace('nbscc.sap_zmmt0021');
查看整体的freespace状况:
select relnamespace::regnamespace as relnamespace,relname,pg_size_pretty(pg_relation_size(relnamespace::regnamespace::text||'.'||relname)),
count(*) as "number of pages",pg_size_pretty(avg(avail::bigint)) as "Av.freespace size",
round(avg(100*avail::bigint)/8192,2) as "Av.freespace ration"
from
(select relnamespace,relname,split_part(split_part(pg_freespace(oid)::text,'(',2),',',1) as blk_no,
split_part(split_part(pg_freespace(oid)::text,')',1),',',2) as avail
from pg_class where relnamespace::regnamespace::text='nbscc' ) freesapce
group by relnamespace,relname
order by pg_relation_size(relnamespace::regnamespace::text||'.'||relname) desc
需要注意的是,delete 数据后,postgresql不会释放空间,vacuum lazy mode与eager mode都不会释放空间,需要使用vacuum full才会释放出空间
我们来看看结果: