PostgreSQL EXPLAIN ANALYZE Visualizer

Paste the output of EXPLAIN ANALYZE — plain text or JSON, straight from psql — and see where your query actually spends its time.

🔒 Your query plan is not sent to any server. Parsing and analysis run entirely in your browser — this page works even offline once loaded.

What this tool does

PostgreSQL's EXPLAIN ANALYZE tells you exactly how a query was executed — but the raw output is famously hard to read. Timings are inclusive (each node's time contains all of its children), row counts are averaged per loop, and the real bottleneck is often buried three levels deep in the tree.

This visualizer parses the plan and shows, for every node:

How to get a plan

Run your query with:

EXPLAIN (ANALYZE, BUFFERS)
SELECT ... your query ...;

and paste the result above — both the default plain-text format and FORMAT JSON are supported. BUFFERS is optional but recommended — it shows how much I/O each node performed. You can paste directly from psql: the QUERY PLAN header and the + line-continuation characters are cleaned up automatically.

⚠️ EXPLAIN ANALYZE really executes the query. For an INSERT/UPDATE/DELETE, wrap it in BEGIN; ... ROLLBACK;.

Sharing a plan

Copy share link encodes the whole plan, compressed, into the URL itself (the part after #). Nothing is uploaded anywhere — the fragment never even reaches our web server — so the zero-upload promise holds. The flip side is worth being explicit about: the link contains the plan, so anyone you send it to can read table names, filter values and row counts in it. Very large plans produce very long URLs; some chat tools truncate those, in which case the recipient gets a clear error instead of a wrong plan.

Warnings this tool detects

Reading the flame graph and the tree

The flame graph at the top is the whole query at a glance: each bar is a plan node, its width is the total time spent in it (children included) and its color is how much of the query's time is the node's own work — green for cheap, red for hot. A wide red bar deep down is your bottleneck; click it to jump to the corresponding node in the tree.

In the tree, execution starts at the leaves (scans) and flows up to the root. The horizontal bar on each node is its exclusive time share: a red bar at a leaf Seq Scan means the time is really spent scanning, not in the join above it. Click a node header to expand its details — costs, row counts, filter conditions, buffer usage — and use Copy text summary to paste a compact report into a ticket or a chat.

Note on parallel queries: timing attribution across parallel workers is an approximation — children of a Gather node report loops per worker, so exclusive times there should be read as indicative.