AFAIK,PostgreSQL VACUUM
命令仅标记为已删除元组占用的可用空间,并且从不缩小数据文件本身。因此,无法确定考虑了多少空间"免费"由DBMS本身。
有没有什么好方法可以判断数据文件中的空间实际占用了多少空间(或索引或其他什么)以及可以自由使用多少空间?
答案 0 :(得分:4)
pgstattuple
模块可以提供此信息。
在doc示例中:
test=> SELECT * FROM pgstattuple('pg_catalog.pg_proc'); -[ RECORD 1 ]------+------- table_len | 458752 tuple_count | 1470 tuple_len | 438896 tuple_percent | 95.67 dead_tuple_count | 11 dead_tuple_len | 3157 dead_tuple_percent | 0.69 free_space | 8932 free_percent | 1.95
free_space
将是您正在寻找的。它是实际数据未占用的字节数,由于自定义填充因子或松散打包的数据,计算先前为真空的行以及行之间的空间。
此外,对于VACUUM
,从不收缩数据文件并非严格属实。如果可用空间恰好位于文件的末尾,它可能会缩小它。
答案 1 :(得分:1)
您所指的通常称为"表膨胀",表中已使用和可用页面之间的比率。
请参阅:
一个简单的查询是:
create extension pgfreespacemap;
select pg_size_pretty(sum(avail)) from pg_freespace('mytable'::regclass);
与pgstattuple
不同,pg_freespace
不必扫描整个表格,因此对于非常大的表格来说更实用。
但请注意,并非表格中的所有空格都是可用的空间。忽略只有几百个字节空闲的页面通常可以提供更多信息,例如:添加where avail > 100
子句或类似内容。