The output of an explain
(or explain analyze
) query
plan for a given
query defaults to a TEXT
format that is meant to be read by a person.
> explain (analyze) select title from books where created_at > now() - '1 year'::interval;
QUERY PLAN
-------------------------------------------------------------------------------------------------
Seq Scan on books (cost=0.00..1.28 rows=5 width=32) (actual time=0.011..0.017 rows=22 loops=1)
Filter: (created_at > (now() - '1 year'::interval))
Planning Time: 0.052 ms
Execution Time: 0.027 ms
(4 rows)
If we instead want the query plan in a standardized format that is parseable
and readable by a program, we can specify an alternate format like JSON
,
YAML
, or XML
.
Here is the same plan with format json
:
> explain (analyze, format json) select title from books where created_at > now() - '1 year'::interval;
QUERY PLAN
----------------------------------------------------------------
[ +
{ +
"Plan": { +
"Node Type": "Seq Scan", +
"Parallel Aware": false, +
"Async Capable": false, +
"Relation Name": "books", +
"Alias": "books", +
"Startup Cost": 0.00, +
"Total Cost": 1.28, +
"Plan Rows": 5, +
"Plan Width": 32, +
"Actual Startup Time": 0.008, +
"Actual Total Time": 0.014, +
"Actual Rows": 22, +
"Actual Loops": 1, +
"Filter": "(created_at > (now() - '1 year'::interval))",+
"Rows Removed by Filter": 0 +
}, +
"Planning Time": 0.050, +
"Triggers": [ +
], +
"Execution Time": 0.023 +
} +
]
(1 row)
I present all four formats for a complex query plan in this Gist.