我正在使用 postgresql 数据库,目前正在试验一些真空/自动真空/完全真空的东西。
据我所知,表中已更新/删除的行仍然占用空间(并且仅被标记为隐藏),直到调用vacuum操作。调用vacuum操作后,这些死元组将被标记为可用空间,这些空间可以被同一个表(或者可能是不同的表?我不确定)重新使用,但空间不会返回给操作系统/文件系统 (OS/FS),而是仍然由数据库保留,直到执行vacuum full操作。
我的问题来了。我能确定表占用了多少磁盘空间吗?
SELECT pg_size_pretty(pg_relation_size('fluffy_table')) AS data_only,
pg_size_pretty(pg_total_relation_size('fluffy_table')) AS with_indexes;
这应该是空间,即为表“保留”的空间,执行 VACUUM FULL 后,这个值可能会改变(如果有一些被删除的行)。
但是这里有个选项,如何在执行 VACUUM FULL 之前获取 VACUUM FULL 之后该表的大小?或者用百分比来表示使用情况?所以我可以说这个表有 100MB 大,但实际数据只使用了 60%(60MB),所以我可以再添加 40% 的行,然后它才会再次增长?
使用原生 postgresql(不带扩展)可以实现吗?
我考虑过将存活元组和死亡元组求和,计算平均行大小,然后以此值计算多个存活/死亡元组。但我已经调用了 VACUUM 操作,所以现在没有关于死亡元组的信息了。
要测量表的大小,您应该使用
pg_table_size()
。毕竟,TOAST表是表数据的一部分。释放的磁盘空间量
VACUUM (FULL)
略小于表中的可用空间,因为即使已填满的表块仍会剩余一些可用空间,无法容纳新的行。不过,表中的可用空间仍然是可用 回收空间量的有用上限VACUUM (FULL)
。要查看表内的可用空间,您必须使用
pgstattuple()
标准扩展 pgstattuple 中的函数:如果该表关联了一个 TOAST 表,您也应该测量该表的可用空间,因为 TOAST 表也会被重建。最后,您应该使用
pgstatindex()
函数测量该表 B 树索引的平均叶子密度,因为索引也会被 重建VACUUM (FULL)
。请记住,默认情况下,B 树索引的 为fillfactor
90,因此新构建的 B 树索引将有 10% 的膨胀。