| name | pg-large-table-optimize |
| description | PostgreSQL 大表识别与容量规划专家技能。给定实例连接信息(主机/端口/用户名/密码),自动发现大表、剔除膨胀水分得到真实数据量、分析每张大表的 DML/扫描/索引负载特征,判定负载类型(高频更新/纯写入/OLTP点查/分析型/混合型),并给出分区改造、autovacuum 调优、索引优化等针对性建议。触发条件:用户提到"大表分析"、"大表优化"、"表膨胀"、"表变胖了"、"数据库容量规划"、"这张表要不要分区"、"autovacuum 调优"、"表统计信息分析"、"pg 性能诊断"、"帮我看看这个 PG 实例有哪些大表"、"数据库瘦身",或提供了 PostgreSQL 连接信息并希望做体检/优化建议。即使用户只说"帮我看看我的库是不是该分区了"或"这个库是不是该做维护了",也应使用本 skill。全程只读,不执行任何 DDL/DML。 |
| tags | ["PostgreSQL","大表优化","表分区","大表工作负载分析"] |
| platform | ["claude-code","cursor"] |
| author | digoal |
| version | 1.0.0 |
| license | GNU General Public License v2.0 |
| homepage | https://github.com/digoal/skills |
PostgreSQL 大表优化与容量规划
给定一个 PostgreSQL 实例的连接信息,识别真实大表(剔除膨胀干扰),分析每张大表的工作负载特征(DML 活跃度、读取模式、索引深度),按负载类型给出结构化优化建议(分区改造、autovacuum 调参、索引重构、归档策略等),最终产出一份可执行的优化优先级报告。
核心原则:全程只读。 本技能只查询系统视图和统计信息,严禁执行任何 DDL 或 DML(包括 VACUUM、ANALYZE、REINDEX 等维护性操作也只建议、不执行)。
前置要求
- 目标实例的连接信息:host、port、user、password(或等效的
.pgpass / 环境变量)、以及可选的目标 dbname(不指定则遍历全部非模板库)。
- 连接账号至少具备:登录权限 + 对目标库的
CONNECT 权限 + 默认情况下 pg_stat_user_tables / pg_stat_user_indexes 等统计视图对所有登录用户可读,无需额外授权;若实例开启了 pg_stat_statements 或安装了 pgstattuple 扩展可获得更精确结果,但不是必需依赖(缺失时自动降级为近似估算,见下文)。
- 运行环境需安装
psql(推荐,用于交互式采集)或 Python 3 + psycopg2-binary(用于批量脚本采集,见 scripts/collect_large_tables.py)。
- 网络需能访问目标数据库的 host:port。若在沙箱/受限网络环境执行,需向用户确认网络策略是否放行该目标地址。
- 不将连接密码写入任何日志文件、不上传到任何外部服务;采集完成后建议清理包含明文密码的临时连接串。
工作流程
阶段 0:连接与预检
- 使用连接信息尝试连接实例,执行
SELECT version(); 确认可连通。
- 检测
pgstattuple 扩展是否已安装:
SELECT extname FROM pg_extension WHERE extname = 'pgstattuple';
已安装则后续膨胀估算可用 pgstattuple() 精确值;未安装则全程使用近似算法,并在最终报告中注明精度限制。
- 列出所有非模板数据库:
SELECT datname FROM pg_database WHERE datistemplate = false AND datallowconn = true;
若用户指定了 dbname,只处理该库;否则逐库遍历(每个库需单独建立连接,PostgreSQL 不支持跨库查询)。
阶段 1:大表发现与膨胀修正
对每个数据库执行 references/sql-queries.md 中的 1.1 大表初筛 查询,取每库 TOP 20(或总大小 > 10GB)的表,输出:库名、Schema、表名、总大小(含索引+TOAST)、表本体大小、索引总大小、TOAST 大小、估算行数(reltuples)、是否分区表及分区数。
对每张候选表执行 1.2 膨胀修正:
- 死元组占比 =
n_dead_tup / (n_dead_tup + n_live_tup) * 100
- 估算膨胀大小 ≈ 表本体大小 × 死元组占比 × 膨胀系数(默认 1.0)
- 修正后真实大小 = 表本体大小 − 估算膨胀大小