La commande EXPLAIN permet d'afficher un plan d'exécution de requête ou une distribution pour une requête. Un plan d'exécution indique comment la ou les tables référencées par la requête sont analysées (par exemple, par une simple analyse séquenctielle).
EXPLAIN [VERBOSE] [DISTRIBUTION] [PLANTEXT|PLANGRAPH] <requête>
| Entrée | Description |
|---|---|
| VERBOSE | Affiche la représentation interne complète de l'arborescence du plan au lieu d'un récapitulatif et envoie le plan au fichier journal du répartiteur. Cette option est utile pour le débogage. |
| <requête> | Requête pour laquelle le plan d'exécution doit être affiché. |
| DISTRIBUTION | Affiche le plan de distribution. Si vous utilisez la sous-commande DISTRIBUTION, la commande EXPLAIN imprime la distribution que le planificateur a utilisé sur une instruction SELECT dans une commande CTAS n'ayant pas spécifié DISTRIBUTE ON(). |
| PLANTEXT | Affiche le plan sous forme de texte. |
| PLANGRAPH | Affiche le plan au format HTML. |
| Sortie | Description |
|---|---|
| NOTICE: query plan: plan | Premier message d'un plan de requête explicite. |
| NOTICE: result-set distribution | Premier message d'une requête de distribution. |
| EXPLAIN | Message indiquant la fin de la requête de distribution ou du plan de requête explicite. |
Cette commande ne requiert pas de droits spéciaux.
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