如何在postgresql 9.1中获取表空间的可用空间量?

时间:2014-10-08 11:54:13

标签: database postgresql postgresql-9.1

AFAIK,PostgreSQL VACUUM命令仅标记为已删除元组占用的可用空间,并且从不缩小数据文件本身。因此,无法确定考虑了多少空间"免费"由DBMS本身。

有没有什么好方法可以判断数据文件中的空间实际占用了多少空间(或索引或​​其他什么)以及可以自由使用多少空间?

2 个答案:

答案 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子句或类似内容。

相关问题