我正在寻找一些实际帮助来解决数据库上的磁盘空间问题。我已经访问过这些页面:
- Postgres:回收空间
- PostgreSQL 表的当前大小(与使用的磁盘空间相比)
- https://stackoverflow.com/questions/41991380/whats-the-difference- Between-pg-table-size-pg-relation-size-pg-total-relatio
在我的上下文中,我仍然有一些问题:我有一个具有 100GB 磁盘空间的数据库。一张表报告使用 73GB 的空间查询:
select
quote_ident(table_schema) || '.' || quote_ident(table_name),
pg_size_pretty(pg_total_relation_size(quote_ident(table_schema) || '.' || quote_ident(table_name))) as disk_size
from
information_schema.tables
where
pg_total_relation_size(quote_ident(table_schema) || '.' || quote_ident(table_name)) > 100000
order by
pg_total_relation_size(quote_ident(table_schema) || '.' || quote_ident(table_name)) desc;
开发人员告诉我他们已经删除了上述表中的许多行。我如何验证这一点?
pg_total_relation_size
返回有关已用磁盘的信息,VACUUM ANALYZE
仅返回可用空间,而不返回磁盘空间。因此pg_total_relation_size
仍然会返回相同的值,对吧?
据我了解,如果我运行VACUUM ANALYZE
它将更新空间管理中的一些引用,数据库可将其用于新行。有没有实用的方法来比较已使用的磁盘空间和实际表大小?可以使用 pgstattuple 或 pg_freespacemap 吗?如果是,您能提供一个查询示例吗?
我还发现一些查询检查返回和pg_catalog.pg_stat_all_tables
的数量。在 a 之后,这些是否会被清除,从而检查 a 之后的死元组总数,看看 a 的可用空间是否不是一个好的指标?n_dead_tup
n_live_tup
VACUUM ANALYZE
VACUUM ANALYZE
VACUUM FULL
使用 pgstattuple 扩展。它将显示表中有多少空间被用户数据、垃圾和空白空间占用:
这将对表执行顺序扫描。还有一个
pgstattuple_approx
对于大型表很有用的功能:它仅扫描表的一部分并推断数字。要检查数据库中的所有表,您可以
如果标准(非完整)真空已经完成,您可以看到特定表上有多少可用空间,如下所示:
或者,如果您关心有多少块至少有 x 量的可用空间,您可以编写一个查询来执行此操作。它只是 SQL,它具有 SQL 所具有的所有灵活性。
如果元组已被删除,但尚未通过真空清理,则 pgstattuple 将是评估该情况的方法。(或者只是运行vacuum,然后使用pg_freespace)。