SPIEGA
Usare il comando EXPLAIN per visualizzare il piano di esecuzione o la distribuzione di una query. Un piano di esecuzione specifica come vengono scansionate la tabella o le tabelle a cui fa riferimento la query (ad esempio, con una semplice scansione sequenziale).
Se si fa riferimento a più tabelle, il piano di esecuzione specifica quali algoritmi di join vengono utilizzati per riunire le tuple richieste da ciascuna tabella di input. Il piano di esecuzione include una stima del costo di esecuzione della query, cioè il numero di millisecondi necessari per eseguirla.
- L'ora di inizio prima che la prima tupla possa essere restituita.
- Il tempo totale per restituire tutte le tuple.
Sintassi
Sintassi del comando EXPLAIN:
EXPLAIN [VERBOSE] [DISTRIBUTION] [PLANTEXT|PLANGRAPH] <query>Input
Il comando EXPLAIN riceve i seguenti input:
| Immissione | Descrizione |
|---|---|
| ESTESO | Visualizza la rappresentazione interna completa dell'albero del piano, invece di un semplice sommario, e invia il piano al file di log del postmaster. Questa opzione è utile per il debug. |
| <query> | La query per la quale deve essere visualizzato il piano di esecuzione. |
| DISTRIBUZIONE | Visualizza il piano di distribuzione. Se si utilizza il sottocomando DISTRIBUZIONE, il comando EXPLAIN stampa la distribuzione utilizzata dal pianificatore per un'istruzione SELECT in un comando CTAS in cui non è stata specificata DISTRIBUZIONE ON(). |
| PIANTEGGIO | Visualizza il piano come testo. |
| PLANGRAFO | Visualizza il piano come HTML. |
Output
Il comando EXPLAIN ha le seguenti uscite:
| Emissione | Descrizione |
|---|---|
| NOTICE: query plan: plan | Il messaggio di avvio per un piano di query esplicito. |
| NOTICE: result-set distribution | Il messaggio di avvio per una richiesta di distribuzione. |
| EXPLAIN | Messaggio che indica la fine del piano di query esplicito o della query di distribuzione. |
Privilegi
Questo comando non richiede privilegi speciali.
Utilizzo
Di seguito sono riportati alcuni esempi di utilizzo.
- Visualizza un piano di query per una semplice query su una tabella con una singola colonna int4 e 128 righe:
MYDB.SCH1(USER)=> EXPLAIN SELECT * FROM foo; NOTICE: QUERY PLAN: Seq Scan on foo (cost=0.00..2.28 rows=128 width=4) EXPLAIN - Visualizzare un piano di query per un join tra le tabelle emp e grp:
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 - Visualizzare un piano di query per la query 3 di TPHC:
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 - Visualizzare la distribuzione da un'istruzione SELECT in un comando CTAS:
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