Mit dem EXPLAIN-Befehl können Sie einen Abfrageausführungsplan oder eine Verteilung für eine Abfrage anzeigen. Ein Ausführungsplan gibt an, wie die von der Abfrage referenzierten Tabellen durchsuchen werden, z. B. von einer einfachen sequenziellen Suche.
EXPLAIN [VERBOSE] [DISTRIBUTION] [PLANTEXT|PLANGRAPH] <Abfrage>
| Eingabe | Beschreibung |
|---|---|
| VERBOSE | Die komplette interne Darstellung der Planstruktur statt nur eine Zusammenfassung anzeigen und den Plan an die Protokolldatei des Postmasters senden. Diese Option ist beim Debugging nützlich. |
| <Abfrage> | Die Abfrage, für die der Ausführungsplan angezeigt werden soll. |
| DISTRIBUTION | Den Verteilungsplan anzeigen. Wenn Sie den DISTRIBUTION-Unterbefehl verwenden, gibt der EXPLAIN-Befehl die Verteilung aus, die der Planer in einer SELECT-Anweisung in einem CTAS-Befehl verwendet hat, in dem DISTRIBUTE ON() nicht angegeben wurde. |
| PLANTEXT | Den Plan als Text anzeigen. |
| PLANGRAPH | Den Plan im HTML-Format anzeigen. |
| Ausgabe | Beschreibung |
|---|---|
| NOTICE: query plan: plan | Die einleitende Nachricht für einen expliziten Abfrageplan. |
| NOTICE: result-set distribution | Die einleitende Nachricht für eine Verteilungsabfrage. |
| EXPLAIN | Nachricht, die das Ende des expliziten Abfrageplans oder der Verteilungsabfrage anzeigt. |
Für diesen Befehl sind keine besonderen Berechtigungen erforderlich.
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