Use o comando EXPLAIN para exibir um plano de execução de consulta ou distribuição para uma consulta. Um plano de execução especifica como a tabela ou tabelas que são referenciadas pela consulta são varridas (por exemplo, por varredura sequencial simples).
EXPLAIN [VERBOSE] [DISTRIBUTION] [PLANTEXT|PLANGRAPH] <query>
| Entrada | Descrição |
|---|---|
| VERBOSE | Exiba a representação interna integral da árvore de planejamento, em vez de apenas um resumo, e envie o plano para o arquivo de log postmaster. Essa opção é útil para depuração. |
| <query> | A consulta para a qual o plano de execução deve ser exibido. |
| DISTRIBUTION | Exiba o plano de distribuição. Se você usar o subcomando DISTRIBUTION, o comando EXPLAIN imprimirá a distribuição que o planejador usou em uma instrução SELECT em um comando CTAS que não especificou DISTRIBUTE ON(). |
| PLANTEXT | Exibe o plano como texto. |
| PLANGRAPH | Exibe o plano como HTML. |
| Saída | Descrição |
|---|---|
| NOTICE: query plan: plan | O líder em mensagens para um plano de consulta explícito. |
| NOTICE: result-set distribution | O líder em mensagens para uma consulta de distribuição. |
| EXPLAIN | Mensagem que indica o final do plano de consulta explícito ou consulta de distribuição. |
Esse comando não requer privilégios especiais.
MYDB.SCH1(USER)=> EXPLAIN SELECT * FROM foo;
NOTICE: QUERY PLAN:
Seq Scan on foo (cost=0.00..2.28 rows=128 width=4)
EXPLAIN
MYDB.SCH1(USER)=> EXPLAIN SELECT emp.* FROM emp,grp WHERE
emp.id=grp.grp_id;
NOTICE: QUERY PLAN:
Hash Join (cost=0.01..0.04 rows=10000 width=28)
-> Seq Scan on emp (cost=0.00..0.01 rows=1000 width=28)
-> Hash (cost=0.01..0.01 rows=1000 width=4)
-> Seq Scan on grp (cost=0.00..0.01 rows=1000 width=4)
EXPLAIN
MYDB.SCH1(USER)=> EXPLAIN SELECT
l_orderkey,
sum(l_extendedprice * (1 - l_discount)) as revenue,
o_orderdate,
o_shippriority
FROM
customer,
orders,
lineitem
WHERE
c_mktsegment = 'BUILDING'
and c_custkey = o_custkey
and l_orderkey = o_orderkey
and o_orderdate < date '1995-03-15'
and l_shipdate > date '1995-03-15'
GROUP BY
l_orderkey,
o_orderdate,
o_shippriority
ORDER BY
revenue desc,
o_orderdate
LIMIT 10;
NOTICE: QUERY PLAN:
Limit (cost=315799480130.29..315799480130.29 rows=10 width=28)
-> Sort (cost=315799480130.29..315799480130.29 rows=360899981912
width=28)
-> Aggregate (cost=19476.76..112854066.90 rows=360899981912
width=28)
-> Group (cost=19476.76..72822.55 rows=360899981912 width=28)
-> Hash Join (cost=19476.76..43432.67 rows=31349208 width=28)
-> Seq Scan on lineitem (cost=0.00..17842.17 rows=322475815
width=20)
-> Hash (cost=19476.76..19476.76 rows=14582120 width=12)
-> Hash Join (cost=1347.66..19476.76 rows=14582120
width=12)
-> Seq Scan on orders (cost=0.00..3606.62
rows=72910603 width=16)
-> Hash (cost=550.60..550.60 rows=3000000 width=4)
-> Seq Scan on customer (cost=0.00..550.60
rows=3000000 width=4)
EXPLAIN
dev(admin)=> EXPLAIN DISTRIBUTION SELECT COUNT(*),grp FROM emp
GROUP BY grp;
NOTICE: Result-set distribution (for "CREATE TABLE AS")
Distributed on hash: "grp"
EXPLAIN