PostgreSQL Execution Plan Analyzer

Paste real EXPLAIN output from PostgreSQL and get a plain-English breakdown of what's slow and why, with an interactive node-graph visualization — free, no signup, nothing sent to a server.

Analyze your plan free

What PlanReader analyzes

PlanReader parses your EXPLAIN output into a normalized plan tree entirely in your browser, runs it through a rule engine that checks for known Postgres performance problems, and renders the result as an interactive node graph you can click through node by node.

Supported input formats

  • EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) — the full JSON plan output, including buffer and timing statistics
  • EXPLAIN ANALYZE (plain text) — the default psql-style text output, including auto_explain captures

What it detects

  • Sequential scan on a large table
  • Row-estimate vs. actual-row mismatches
  • Disk-based sort or hash spills
  • Nested loop joins producing far more rows than estimated
  • Missing index opportunities, where derivable from the plan itself
  • Non-sargable predicates that prevent index use
  • Buffer cache inefficiency and heavy disk reads
  • Parallel worker shortfalls against the planned degree of parallelism

Example finding

A nested loop join estimated 12 rows but actually produced 6,104 — a 500x miss that made it the most expensive step in the query. PlanReader flags this as an exploding join, shows exactly where it happens in the graph, and explains in plain English what usually causes it (stale statistics or a bad selectivity estimate) instead of just showing you a row-count table.

Privacy

  • Nothing you paste is ever sent to a server — parsing and analysis run entirely in your browser
  • No account, no signup, no tracking of plan content
  • Share links encode your plan into the URL itself, in a fragment your browser never sends in any request — not stored anywhere
  • Local history, if you use it, stays in your own browser's storage

How to generate EXPLAIN input

For the JSON format (recommended — includes buffer stats):

EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) SELECT ...;

For plain text:

EXPLAIN ANALYZE SELECT ...;

Try a sample plan

No plan handy? Load a real Postgres sample and see PlanReader work immediately — no paste required.

Try a sample Postgres plan

Deep learning resources

For a comprehensive guide to reading EXPLAIN output beyond what PlanReader's own detections cover: kiransabne.dev