PostgreSQL pg_total_relation_size() 函数使用指南
PostgreSQL pg_total_relation_size() 是整个 PostgreSQL 数据库管理中最具综合性与实用价值的存储空间统计函数。在生产环境中,单张表除了自身的数据行外,往往还建立有主键、唯一约束和多列复合索引,甚至带有 TOAST 关联表。
pg_total_relation_size() 能够计算并返回目标关系所消耗的绝对完整物理磁盘空间。它完整汇聚了表主体、所有二级索引(Indexes)、TOAST 表及其 TOAST 索引,以及空闲空间映射(FSM)与可见性映射(VM)。对于容量预警、备份规划以及大表分表评估,该函数是最权威的度量标准。
PostgreSQL pg_total_relation_size() 语法
这里是 PostgreSQL pg_total_relation_size() 函数的标准语法:
pg_total_relation_size(relation)
参数
relation- 必需的。指定关系的对象标识,支持
regclass类型(例如'public.orders'、'users')或目标关系的数字 OID。
返回值
返回一个 bigint 整数,代表该关系及其全部附属关联对象在磁盘上占据的物理字节总和:
- 计算公式:
pg_total_relation_size = pg_table_size(表数据与TOAST) + pg_indexes_size(全部索引)。 - 若传入的表名不存在,PostgreSQL 将抛出错误。
PostgreSQL pg_total_relation_size() 示例
以下示例展示如何利用该函数对数据库进行多维度的容量剖析。
查询指定表的总容量
SELECT
'user_payments' AS table_name,
pg_size_pretty(pg_total_relation_size('user_payments')) AS total_disk_footprint;
输出:
table_name | total_disk_footprint
---------------+----------------------
user_payments | 4850 MB精准拆解:表主体数据 vs 索引占用空间
通过将 pg_total_relation_size 与 pg_table_size、pg_indexes_size 结合,可以一目了然地识别出是否存在“索引体积倒挂”(索引大小甚至超过数据本身)的不合理设计:
SELECT
relname AS table_name,
pg_size_pretty(pg_total_relation_size(c.oid)) AS total_size,
pg_size_pretty(pg_table_size(c.oid)) AS data_size,
pg_size_pretty(pg_indexes_size(c.oid)) AS index_size,
ROUND(100.0 * pg_indexes_size(c.oid) / NULLIF(pg_total_relation_size(c.oid), 0), 2) AS index_ratio_pct
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind = 'r' AND n.nspname = 'public'
ORDER BY pg_total_relation_size(c.oid) DESC
LIMIT 5;
输出:
table_name | total_size | data_size | index_size | index_ratio_pct
--------------+------------+-----------+------------+-----------------
orders | 3500 MB | 2100 MB | 1400 MB | 40.00
user_logs | 1800 MB | 1650 MB | 150 MB | 8.33
transactions | 950 MB | 400 MB | 550 MB | 57.89从结果中清晰可见,transactions 表的索引占比高达 57.89%,提示 DBA 需审查是否存在冗余或重复索引。
结论
pg_total_relation_size()是评估数据库单表真实磁盘占用的最终依据。- 在实施逻辑备份(如
pg_dump)或物理分区分表时,通过该函数可准确预估存储资源需求与网络传输带宽。 - 定期监控此指标有助于及早发现异常的数据暴增或未清理的死亡索引元数据。