DBAtlas · 数据库运维图谱

列出按 heap / index / TOAST 细分的表大小以及最大的索引

PostgreSQL存储

命令

SELECT n.nspname AS schema_name,
       c.relname AS table_name,
       pg_size_pretty(pg_total_relation_size(c.oid)) AS total,
       pg_size_pretty(pg_relation_size(c.oid)) AS heap,
       pg_size_pretty(pg_indexes_size(c.oid)) AS indexes,
       pg_size_pretty(pg_total_relation_size(c.oid) - pg_relation_size(c.oid) - pg_indexes_size(c.oid)) AS toast_fsm_vm,
       round(100.0 * pg_total_relation_size(c.oid) / NULLIF(pg_database_size(current_database()), 0), 1) AS pct_of_db
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r', 'm')
  AND n.nspname NOT IN ('pg_catalog', 'information_schema')
ORDER BY pg_total_relation_size(c.oid) DESC
LIMIT 20;

-- Largest indexes and their usage counts
SELECT s.schemaname,
       s.relname AS table_name,
       s.indexrelname AS index_name,
       pg_size_pretty(pg_relation_size(s.indexrelid)) AS index_size,
       s.idx_scan,
       i.indisunique,
       i.indisprimary
FROM pg_stat_user_indexes s
JOIN pg_index i ON i.indexrelid = s.indexrelid
ORDER BY pg_relation_size(s.indexrelid) DESC
LIMIT 20;

作用

显示最大的表,按总量、heap、索引和 TOAST(+FSM/VM)细分,并给出其在数据库中的占比;以及最大的索引及其扫描次数和 unique/primary 标志。

适用场景

用于在磁盘使用上升时找出增长来自哪里(数据、索引还是 TOAST),并发现未使用的大索引。

注意

大小函数会为每个关系访问文件系统,在有数万张表的数据库中可能很慢。分区父表(relkind 'p')本身为 0 字节,已被排除;计算整个层次结构的总量:SELECT pg_size_pretty(sum(pg_total_relation_size(relid))) FROM pg_partition_tree('sales'); idx_scan = 0 的大索引是删除候选,但计数器只覆盖自上次统计信息重置以来的时间,且只针对本服务器(副本上的使用不可见);unique/primary 索引用于强制约束,不能删除。

在 DBAtlas 中打开 →

相关内容