POSTGRES EXPLAIN ANALYZER · RUNS IN YOUR BROWSER

Why is your Postgres query slow?

Paste the output of EXPLAIN (ANALYZE, BUFFERS) — text or JSON — and get the time spent in each node, the filters that throw away most rows, bad row estimates, sorts and hashes spilling to disk and nested loops over sequential scans, each with a suggested fix.

Nothing is uploaded. The text box is analysed in this browser and never leaves your device. It reads one plan and never touches your database: suggestions are hypotheses to test on your own data.

1. Paste a plan

Prefer a CLI, or want a query-time gate in CI?

Same logic, zero dependencies, one command — reads a file or stdin:

psql -At -c "EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) SELECT ..." | node cli.mjs analyze -
node cli.mjs analyze plan.txt
node cli.mjs analyze plan.json --max-ms 200      # exit 1 over budget
node cli.mjs analyze plan.txt --fail-on warn --json

Get cli.mjs and engine.mjs — Node 18+, nothing to install, no network call. More: how to read an EXPLAIN ANALYZE plan and fix a slow query.

What's recognised

InputHandling

Common questions

Does this connect to my database?

No. It reads the plan text you paste. It never connects to a database, so it cannot see your schema, your data volume, your existing indexes or your Postgres settings. Treat every suggestion as a hypothesis to test, not a diagnosis.

Is it safe to run EXPLAIN ANALYZE?

EXPLAIN ANALYZE actually executes the statement. For SELECT that is usually fine on a replica or off-peak; for INSERT, UPDATE or DELETE wrap it in BEGIN ... ROLLBACK, or run it on a copy. Add BUFFERS to get the I/O lines.

How is time attributed to each node?

Self time is the node's actual total time multiplied by its loops, minus the same figure for its children. Under parallel nodes workers overlap, so those figures are approximate.

Is my plan uploaded anywhere?

No. The page analyses the text in your own browser and never sends it anywhere. The CLI reads a local file or stdin and makes no network call.