postgres-diagnostics
GitHub用于诊断PostgreSQL数据库性能、健康状态及优化建议的只读技能。通过pgbot工具分析慢查询、索引、真空等指标,生成优先级明确的优化计划,严禁执行写入操作或猜测数据。
Trigger Scenarios
Install
npx skills add pgrundev/pgbot --skill postgres-diagnostics -g -y
SKILL.md
Frontmatter
{
"name": "postgres-diagnostics",
"description": "Use when someone reports a slow, bloated, or unhealthy PostgreSQL database, or asks what to optimize, drop, vacuum, index, or tune. Runs read-only pgbot diagnostics and turns them into a prioritized, caveat-aware plan. Do not use for writing SQL, migrations, or app logic."
}
PostgreSQL diagnostics with pgbot
pgbot is a read-only Postgres diagnostic tool. Its findings are computed deterministically (in Go, not by a model) and it never writes to the database. Treat pgbot's output as the source of truth. Your job is to run the right command, then interpret, prioritize, and recommend — never to invent diagnoses or act on the database.
When to use this skill
- "why is my database slow", "what should I optimize", "is my DB healthy?"
- "which indexes can I drop", "what's using all the disk", "is autovacuum keeping up?"
- "what query is eating the database", "should I re-tune anything?"
- Any Postgres performance / health / bloat / index / vacuum / config question.
How to run it
If the pgbot MCP server is connected, call its tools: inspect (start here),
top_queries, vacuum_health, unused_indexes. They return stable JSON.
Otherwise run the CLI. It needs a connection string for a read-capable role
(ideally one with pg_monitor). Pick the command that matches the question:
| Question | Command |
|---|---|
| Open-ended / "is it healthy" | pgbot inspect "$DSN" (health score + worst-first findings) |
| Full detail | pgbot inspect "$DSN" --full |
| "What's eating the database?" | pgbot queries "$DSN" (top by total time; --by-calls to re-rank) |
| "What's using disk / biggest tables?" | pgbot tables "$DSN" (size + seq-vs-index scan = missing-index radar) |
| "Is autovacuum keeping up?" | pgbot vacuum "$DSN" |
| "Which indexes can I drop?" | pgbot indexes "$DSN" |
| "Should I re-tune config?" | pgbot tune "$DSN" |
| Machine-readable for parsing | pgbot inspect "$DSN" --json |
Add --timeout 60s for large or remote databases.
Rules — non-negotiable
- Findings are facts. Do not invent a number, table, index, or query id beyond what pgbot reports. If pgbot didn't measure it, say what pgbot would need to collect to find out.
- Carry every caveat into the recommendation. Example: "unused index" scan
counts are per-node — on a primary, a replica may still use an index that
looks unused. pgbot flags this; never recommend dropping an index without
its caveat. (pgbot's
tables/indexesand the JSON make replication state visible — check it.) - Never execute the user's query to diagnose it. No
EXPLAIN ANALYZE, no running the statement "just to time it." Suggest only safe, non-executing steps (EXPLAINwithoutANALYZEis fine; it doesn't run the query). - Prioritize by impact, not by count. Risk (time-to-incident: wraparound, a WAL-pinning replication slot, a filling disk) comes first. Then the biggest latency/storage win. A 9 GiB unused-index reclaim may matter less than one query eating 60% of DB time — say which to do first and why.
- Never write to the database. pgbot is read-only; you recommend, you don't
act. Hand the user the exact
DROP INDEX CONCURRENTLY/ALTER/VACUUMstatement to run themselves. - Hedge low confidence. A finding below 0.5 confidence is a possibility ("may", "possibly"), not an assertion.
Output shape
- One-line health verdict.
- Worst-first, at most ~3 issues. For each: the problem with pgbot's number → a likely cause only if the data (deltas/events) supports one → a safe, concrete recommended step, with its caveat inline.
- Briefly name what's healthy, so the user knows what was checked.
Reading the signals
tables: a large table with heavyseq scansand fewidx scansis a likely missing-index candidate — cross-check it againstqueries(a top query filtering that table confirms it).queries:shareis % of total DB execution time. A single query above ~30% is the real hot path; index-dropping won't touch it.vacuum:due? yeswith a stale/neverlast-autovacuum means autovacuum is falling behind — the early signal for bloat and, downstream, wraparound.- replication-slot findings: an inactive slot retaining WAL fills the disk; treat it as time-to-incident, not cosmetic.
Safety and privacy
pgbot only ever reads. Nothing leaves the machine except pgbot explain /
pgbot ask, which send the PII-free findings (normalized query text, no
literals) to an LLM and say so first. Use a role with pg_monitor; never paste a
production superuser credential where it can leak.
Version History
- 0b7a374 Current 2026-08-19 11:33


