用途:在缺少文档的 PostgreSQL 数据库中做结构考古,梳理表、列、约束、索引、大小、依赖关系和 schema 浪费(未使用索引、冗余索引、孤儿行、遗留 serial 列)。也可在 DROP TABLE / DROP COLUMN 前确认会破坏哪些对象。
主要能力与用法:
-
检查入口:优先用 pg_catalog,仅在查询需跨数据库移植时用 information_schema。快速首轮可用 psql 元命令,如 \d name、\dt+、\di+、\dv+、\df+、\dn、\dp、\du、\dx、\l。
-
外键图:查询 pg_constraint 且 contype = 'f'。conrelid 是子表,confrelid 是父表,可重建无文档数据库的引用图。
-
大小:按需选择 pg_relation_size(仅主数据分支)、pg_table_size(堆 + TOAST + FSM + VM)、pg_indexes_size、pg_total_relation_size,并用 pg_size_pretty 输出。
-
未使用索引:pg_stat_user_indexes 中 idx_scan = 0,需排除 indisunique;last_idx_scan(v16+)显示最近使用时间。
-
冗余索引:比较 pg_index 的 indkey 列列表,前导列相同或一个为另一个前缀即视为冗余。
-
孤儿行:LEFT JOIN 父表后对父键做 NULL 判断。
-
DROP 前依赖检查:先查 pg_depend(refobjid 为对象 OID),或先执行 DROP ... RESTRICT 读取失败列表,确认后再 CASCADE;严禁未看列表就盲用 CASCADE。
-
序列与 IDENTITY 审计:用 pg_attribute.attidentity 区分 GENERATED ALWAYS(a)、BY DEFAULT(d)与 serial(空)。
适用场景:探索非自己设计且无文档的库、查找引用某表的所有外键、定位从未扫描或重复冗余的索引、测量表与索引磁盘占用、DROP 前影响评估、遗留 schema 审计。
限制:不用于从零设计新 schema,不用于阅读或修复慢查询执行计划,不处理死元组膨胀清理本身。idx_scan = 0 的结论须确认统计窗口足够长,避免在 pg_stat_reset() 后误判。物理列顺序不可信,被删列会在 attnum 留下空隙;系统列 ctid、xmin、xmax 不出现在 \d 输出中。官方文档参考 PostgreSQL 17 catalogs、monitoring-stats、information-schema 页面。