IBM PureData System for Analytics, Version 7.1

EXPLAIN

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.

Wenn mehrere Tabellen referenziert werden, gibt der Ausführungsplan an, mit welchen Joinalgorithmen die erforderlichen Tupel aus jeder Eingabetabelle zusammengebracht werden. Der Ausführungsplan beinhaltet eine Schätzung der Abfrageausführungskosten, d. h. die Anzahl der für die Ausführung der Abfrage erforderlichen Millisekunden.
  • Die Startzeit, bevor das erste Tupel zurückgegeben werden kann.
  • Die Gesamtzeit, um alle Tupel zurückzugeben.
Wenn Sie die Anzahl zurückzugebender Tupel mit einer Limitklausel begrenzen, interpoliert der Planer zwischen den Endpunktkosten, um zu schätzen, welcher Plan der effizienteste ist.

Syntax

Syntax für den EXPLAIN-Befehl:
EXPLAIN [VERBOSE] [DISTRIBUTION] [PLANTEXT|PLANGRAPH] <Abfrage>

Eingaben

Der EXPLAIN-Befehl akzeptiert folgende Eingaben:
Tabelle 1. Eingaben für EXPLAIN
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.

Ausgaben

Der EXPLAIN-Befehl hat die folgenden Ausgaben:
Tabelle 2. Ausgaben von EXPLAIN
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.

Berechtigungen

Für diesen Befehl sind keine besonderen Berechtigungen erforderlich.

Verwendung

Es folgen Verwendungsbeispiele.
  • Abfrageplan einer einfachen Abfrage für eine Tabelle mit einer einzelnen int4-Spalte und 128 Zeilen anzeigen:
    MYDB.SCH1(USER)=> EXPLAIN SELECT * FROM foo;
           NOTICE:  QUERY PLAN:
       Seq Scan on foo  (cost=0.00..2.28 rows=128 width=4)
       EXPLAIN
  • Abfrageplan für einen Join zwischen den Tabellen emp und grp anzeigen:
    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
  • Abfrageplan für TPHC-Abfrage 3 anzeigen:
    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
  • Verteilung aus einer SELECT-Anweisung in einem CREATE TABLE AS-Befehl anzeigen:
    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


Feedback | Copyright IBM Corporation 2014 | Letzte Aktualisierung: 2014-02-28