Understand what PostgreSQL is really doing

Free browser-based tools and no-fluff guides for developers who work with PostgreSQL every day: read query plans, pick the right index, keep VACUUM happy.

From EXPLAIN plan to visual tree An EXPLAIN plan appears in a panel, travels along an arrow and becomes a tree of nodes, with the slow node highlighted in red. EXPLAIN Hash Join -> Seq Scan -> Index Scan cost=18542 rows=1M Hash Join Seq Scan142 ms Index Scan3 ms !
🔒 Nothing is uploaded. All parsing and analysis happens client-side in your browser. Your query plans, queries and data never reach any server.

Tools

Tool

EXPLAIN ANALYZE Visualizer

Paste EXPLAIN ANALYZE output — plain text or JSON — and get a flame graph plus an interactive plan tree: per-node timings, row-estimate mismatches and disk spills highlighted automatically. Shareable links included.

Animated flame graph previewStacked horizontal bars for query plan nodes, with a scan line sweeping across and the most expensive node pulsing in red.

PostgreSQL guides

All guides →
Guide

How to read EXPLAIN ANALYZE

Costs vs actual times, per-loop averages, buffers, and the classic traps that make plans lie to you.

Guide

Choosing the right index

B-tree, GIN, GiST, BRIN and friends: what each index type is for, plus partial, expression and covering indexes.

Guide

VACUUM, autovacuum and bloat

Why MVCC leaves dead rows behind, how autovacuum decides when to run, and how to spot a table that's bloating.

Guide

Transaction isolation levels

Read Committed vs Repeatable Read vs Serializable in practice: anomalies, serialization errors, and when to retry.

Reference

PostgreSQL cheat sheet

The everyday commands on one printable sheet — or grab the ready-made two-page PDF with the logo and clickable links.

PostgreSQL error reference

All errors →
Error

deadlock detected

Two transactions each hold a lock the other needs. How to read the DETAIL lines and the lock-ordering habits that prevent it.

Error

too many clients already

max_connections is exhausted. Who is holding the slots, and why the durable fix is usually a pooler, not a bigger limit.

Error

duplicate key value

A unique constraint did its job — the interesting question is why: an insert race, a stale sequence, or a client retrying.

Error

relation does not exist

The table exists — you're just not looking where PostgreSQL is looking: search_path, quoted identifiers, wrong database.

Why pgviz?

Reading a raw PostgreSQL query plan is hard: timings are cumulative, row counts are per-loop averages, and the interesting problems (bad estimates, sorts spilling to disk, expensive nested loops) hide in the details. The tools on this site do the arithmetic for you and point at what actually matters, and the guides explain the concepts behind the numbers.

Everything here is free, works offline once loaded, and sends nothing to any server. Alongside the tools you'll find practical guides and a growing reference of common PostgreSQL errors — what each one means, why it happens and how to fix it. More is coming: a postgresql.conf generator and an index size calculator.