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.
Se si limita il numero di tuple da restituire con una clausola di limitazione, il pianificatore interpola i costi degli endpoint per stimare quale sia il piano più efficiente.

Sintassi

Sintassi del comando EXPLAIN:
EXPLAIN [VERBOSE] [DISTRIBUTION] [PLANTEXT|PLANGRAPH] <query>

Input

Il comando EXPLAIN riceve i seguenti input:
Tabella 1. ESPLORA Ingresso
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:
Tabella 2. EXPLAIN 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