EXPLAIN ANALYZE
EXPLAIN ANALYZE
used to display a query execution plan along with actual run-time performance statistics.
This is useful for analyzing query performance and identifying bottlenecks in a query.
Syntax
EXPLAIN ANALYZE <statement>
Examples
TPC-H Q21:
EXPLAIN ANALYZE SELECT s_name,
-> Count(*) AS numwait
-> FROM supplier,
-> lineitem l1,
-> orders,
-> nation
-> WHERE s_suppkey = l1.l_suppkey
-> AND o_orderkey = l1.l_orderkey
-> AND o_orderstatus = 'F'
-> AND l1.l_receiptdate > l1.l_commitdate
-> AND EXISTS (SELECT *
-> FROM lineitem l2
-> WHERE l2.l_orderkey = l1.l_orderkey
-> AND l2.l_suppkey <> l1.l_suppkey)
-> AND NOT EXISTS (SELECT *
-> FROM lineitem l3
-> WHERE l3.l_orderkey = l1.l_orderkey
-> AND l3.l_suppkey <> l1.l_suppkey
-> AND l3.l_receiptdate > l3.l_commitdate)
-> AND s_nationkey = n_nationkey
-> AND n_name = 'EGYPT'
-> GROUP BY s_name
-> ORDER BY numwait DESC,
-> s_name
-> LIMIT 100;
+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| explain |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Limit |
| ├── limit: 100 |
| ├── offset: 0 |
| ├── estimated rows: 100.00 |
| ├── total process time: 0ms |
| └── Sort |
| ├── sort keys: [numwait DESC NULLS LAST, s_name ASC NULLS LAST] |
| ├── estimated rows: 11000.00 |
| ├── total process time: 0ms |
| └── EvalScalar |
| ├── expressions: [COUNT(*) (#70)] |
| ├── estimated rows: 11000.00 |
| ├── total process time: 0ms |
| └── AggregateFinal |
| ├── group by: [s_name] |
| ├── aggregate functions: [count()] |
| ├── estimated rows: 11000.00 |
| └── AggregatePartial |
| ├── group by: [s_name] |
| ├── aggregate functions: [count()] |
| ├── estimated rows: 11000.00 |
| ├── total process time: 1ms |
| └── HashJoin |
| ├── join type: LEFT ANTI |
| ├── build keys: [l3.l_orderkey (#52)] |
| ├── probe keys: [l1.l_orderkey (#7)] |
| ├── filters: [noteq(l3.l_suppkey (#54), l1.l_suppkey (#9))] |
| ├── estimated rows: 1633696.00 |
| ├── total process time: 788ms |
| ├── Filter(Build) |
| │ ├── filters: [gt(l3.l_receiptdate (#64), l3.l_commitdate (#63))] |
| │ ├── estimated rows: 2400786.33 |
| │ ├── total process time: 85ms |
| │ └── TableScan |
| │ ├── table: default.tpch.lineitem |
| │ ├── read rows: 7202359 |
| │ ├── read bytes: 42731029 |
| │ ├── partitions total: 9 |
| │ ├── partitions scanned: 9 |
| │ ├── pruning stats: [segments: <range pruning: 9 to 9>, blocks: <range pruning: 9 to 9, bloom pruning: 0 to 0>] |
| │ ├── push downs: [filters: [gt(l3.l_receiptdate (#64), l3.l_commitdate (#63))], limit: NONE] |
| │ ├── output columns: [l_orderkey, l_suppkey, l_commitdate, l_receiptdate] |
| │ └── estimated rows: 7202359.00 |
| └── HashJoin(Probe) |
| ├── join type: LEFT SEMI |
| ├── build keys: [l2.l_orderkey (#36)] |
| ├── probe keys: [l1.l_orderkey (#7)] |
| ├── filters: [noteq(l2.l_suppkey (#38), l1.l_suppkey (#9))] |
| ├── estimated rows: 1633696.00 |
| ├── total process time: 905ms |
| ├── TableScan(Build) |
| │ ├── table: default.tpch.lineitem |
| │ ├── read rows: 7202359 |
| │ ├── read bytes: 17507468 |
| │ ├── partitions total: 9 |
| │ ├── partitions scanned: 9 |
| │ ├── pruning stats: [segments: <range pruning: 9 to 9>, blocks: <range pruning: 9 to 9, bloom pruning: 0 to 0>] |
| │ ├── push downs: [filters: [], limit: NONE] |
| │ ├── output columns: [l_orderkey, l_suppkey] |
| │ └── estimated rows: 7202359.00 |
| └── HashJoin(Probe) |
| ├── join type: INNER |
| ├── build keys: [orders.o_orderkey (#23)] |
| ├── probe keys: [l1.l_orderkey (#7)] |
| ├── filters: [] |
| ├── estimated rows: 1633696.00 |
| ├── total process time: 338ms |
| ├── Filter(Build) |
| │ ├── filters: [eq(orders.o_orderstatus (#25), "F")] |
| │ ├── estimated rows: 550000.00 |
| │ ├── total process time: 42ms |
| │ └── TableScan |
| │ ├── table: default.tpch.orders |
| │ ├── read rows: 1650000 |
| │ ├── read bytes: 5173599 |
| │ ├── partitions total: 3 |
| │ ├── partitions scanned: 3 |
| │ ├── pruning stats: [segments: <range pruning: 3 to 3>, blocks: <range pruning: 3 to 3, bloom pruning: 3 to 3>] |
| │ ├── push downs: [filters: [eq(orders.o_orderstatus (#25), "F")], limit: NONE] |
| │ ├── output columns: [o_orderkey, o_orderstatus] |
| │ └── estimated rows: 1650000.00 |
| └── HashJoin(Probe) |
| ├── join type: INNER |
| ├── build keys: [nation.n_nationkey (#32)] |
| ├── probe keys: [supplier.s_nationkey (#3)] |
| ├── filters: [] |
| ├── estimated rows: 184766.67 |
| ├── total process time: 93ms |
| ├── Filter(Build) |
| │ ├── filters: [eq(nation.n_name (#33), "EGYPT")] |
| │ ├── estimated rows: 16.67 |
| │ ├── total process time: 0ms |
| │ └── TableScan |
| │ ├── table: default.tpch.nation |
| │ ├── read rows: 50 |
| │ ├── read bytes: 566 |
| │ ├── partitions total: 2 |
| │ ├── partitions scanned: 2 |
| │ ├── pruning stats: [segments: <range pruning: 2 to 2>, blocks: <range pruning: 2 to 2, bloom pruning: 2 to 2>] |
| │ ├── push downs: [filters: [eq(nation.n_name (#33), "EGYPT")], limit: NONE] |
| │ ├── output columns: [n_nationkey, n_name] |
| │ └── estimated rows: 50.00 |
| └── HashJoin(Probe) |
| ├── join type: INNER |
| ├── build keys: [supplier.s_suppkey (#0)] |
| ├── probe keys: [l1.l_suppkey (#9)] |
| ├── filters: [] |
| ├── estimated rows: 11086.00 |
| ├── total process time: 447ms |
| ├── TableScan(Build) |
| │ ├── table: default.tpch.supplier |
| │ ├── read rows: 11000 |
| │ ├── read bytes: 42015 |
| │ ├── partitions total: 2 |
| │ ├── partitions scanned: 2 |
| │ ├── pruning stats: [segments: <range pruning: 2 to 2>, blocks: <range pruning: 2 to 2, bloom pruning: 0 to 0>] |
| │ ├── push downs: [filters: [], limit: NONE] |
| │ ├── output columns: [s_suppkey, s_name, s_nationkey] |
| │ └── estimated rows: 11000.00 |
| └── Filter(Probe) |
| ├── filters: [gt(l1.l_receiptdate (#19), l1.l_commitdate (#18))] |
| ├── estimated rows: 2400786.33 |
| ├── total process time: 59ms |
| └── TableScan |
| ├── table: default.tpch.lineitem |
| ├── read rows: 7202359 |
| ├── read bytes: 42731029 |
| ├── partitions total: 9 |
| ├── partitions scanned: 9 |
| ├── pruning stats: [segments: <range pruning: 9 to 9>, blocks: <range pruning: 9 to 9, bloom pruning: 0 to 0>] |
| ├── push downs: [filters: [gt(l1.l_receiptdate (#19), l1.l_commitdate (#18))], limit: NONE] |
| ├── output columns: [l_orderkey, l_suppkey, l_commitdate, l_receiptdate] |
| └── estimated rows: 7202359.00 |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------+