explain-and-analyze

Table of Contents

And Analyze

Explain & Analyze

Explain

Explain generates a query plan by estimating the cost.

This is a sequential scan on a table users.

EXPLAIN SELECT * FROM users;

                       QUERY PLAN
---------------------------------------------------------
 Seq Scan on users  (cost=0.00..155.00 rows=10000 width=4)
(1 row)

We can format this in JSON if we so desire:

EXPLAIN (FORMAT JSON) SELECT * FROM users;
           QUERY PLAN
----------------------------------
 [                               +
   {                             +
     "Plan": {                   +
       "Node Type": "Seq Scan",  +
       "Relation Name": "users", +
       "Alias": "users",         +
       "Startup Cost": 0.00,     +
       "Total Cost": 155.00,     +
       "Plan Rows": 10000,       +
       "Plan Width": 4           +
     }                           +
   }                             +
 ]

If there is an index, and the query uses it (normally with a WHERE statement)

EXPLAIN SELECT * FROM foo WHERE i = 4;

                         QUERY PLAN
--------------------------------------------------------------
 Index Scan using fi on foo  (cost=0.00..5.98 rows=1 width=4)
   Index Cond: (i = 4)
(2 rows)

Explain Analyze

Explain analyze actually runs the query in question: if you want to run a query that has side effects (i.e. queries that aren't SELECTs), you will want to run EXPLAIN ANALYZE in a transaction.

Always do something like this:

BEGIN;
EXPLAIN ANALYZE ...;
ROLLBACK;