Postgres 表大小和记录数

Postgres 表大小和记录数

我想了解以下查找 x MB 表的大小的结果行为,同时尝试计算此表中的记录,但在 postgres 数据库中未找到任何记录

db_server=# \dt+
                                 List of relations
Schema  |             Name             | Type  |  Owner  |    Size    | Description 
--------+------------------------------+-------+---------+------------+-------------
user    | table                        | table | user    | 7592 MB    | 




db_server=# select count(*) from table  ;
 count 
-------
     0

答案1

最有可能的是bloat(死元组)。从VACUUM描述(https://www.postgresql.org/docs/13/sql-vacuum.html):

VACUUM 可回收死元组占用的存储空间。在正常的 PostgreSQL 操作中,被更新删除或废弃的元组不会从其表中物理移除;它们会一直存在,直到 VACUUM 完成。因此,有必要定期执行 VACUUM,尤其是在频繁更新的表上。

这里有一些复杂的查询需要报告:https://wiki.postgresql.org/wiki/Show_database_bloat 这篇文章也很有帮助:https://www.percona.com/blog/2018/08/06/basic-understanding-bloat-vacuum-postgresql-mvcc/ VACUUM应该清理它。简而言之,当您插入数据然后更新或删除它时,就会发生这种情况。删除的空间不会被释放,因为较旧的事务可能需要它。更新是因为copy on write较旧的事务可能需要较旧的数据。另一个因素是数据被组织成 8kB 页面。页面必须是空的,才能定期VACUUM释放它。如果页面被部分使用,那么只能VACUUM FULL回收该空间,但据我记得,该操作需要更长时间,需要临时空间并锁定表。还应该有一个autovacuum进程正在运行,应该在某个时候清理它。autovacuum自 8.3 以来默认启用。

相关内容