我想了解以下查找 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 以来默认启用。