DB2 Universal Database - Systemverwaltung


Beschreibung der Ausgabe von db2expln und dynexpln

In der Ausgabe werden die EXPLAIN-Informationen für jedes Paket in zwei Komponenten unterteilt:

Die Schritte eines Zugriffsplans oder Abschnitts werden in der Reihenfolge aufgeführt, in der sie vom Datenbankmanager ausgeführt werden. Jeder Hauptschritt wird als linksbündig ausgerichtete Überschrift angezeigt. Informationen zum Schritt werden darunter eingerückt angezeigt. In der linken Spalte der EXPLAIN-Ausgabe für den Zugriffsplan befinden sich Einrückungsbalken. Diese Balken zeigen auch den "Bereich" der Operation an. Operationen niedrigerer Einrückungsstufe innerhalb derselben Operation (d. h. solche, die weiter rechts angezeigt werden) werden verarbeitet, bevor zur vorherigen Einrückungsstufe zurückgekehrt wird.

Es ist zu beachten, daß der ausgewählte Zugriffsplan auf einer verbesserten Version der ursprünglichen SQL-Anweisung (der in der Ausgabe gezeigten) basiert. Beispielsweise kann die ursprüngliche Anweisung die Aktivierung einer beliebigen Anzahl von Auslösern und Einschränkungen bewirken. Die SQL-Anweisung kann nun von der Komponente zum Umschreiben von Abfragen des SQL-Compilers in ein gleichwertiges, aber effizienteres Format umgesetzt werden. Alle diese Faktoren sind in den Informationen enthalten, die an das Optimierungsprogramm weitergeleitet werden, wenn es den effizientesten Plan zum Ausführen der Anweisung ermittelt. Daher kann sich der in der EXPLAIN-Ausgabe angezeigte Zugriffsplan erheblich von dem unterscheiden, der für die ursprüngliche SQL-Anweisung vermutet werden könnte. Die integrierte EXPLAIN-Einrichtung zeigt die tatsächlich für die Optimierung verwendete SQL-Anweisung in Form einer Anweisung im SQL-Format an, die durch Rückübersetzung der internen Darstellung der Abfrage erstellt wird (eine Beschreibung der integrierten EXPLAIN-Einrichtung finden Sie in Kapitel 26, Die SQL-EXPLAIN-Einrichtung).

Beim Vergleichen der Ausgabe von db2expln oder dynexpln mit der Ausgabe der EXPLAIN-Einrichtung kann die Option (-i) für die Operator-ID sehr nützlich sein. Jedesmal, wenn db2expln bzw. dynexpln die Verarbeitung eines neuen Operators aus der EXPLAIN-Einrichtung beginnt, wird die Operator-ID links neben dem mit EXPLAIN bearbeiteten Plan ausgegeben. Die Operator-ID kann zum Abgleichen der Schritte in den verschiedenen Darstellungen des Zugriffsplans verwendet werden. Beachten Sie, daß es nicht immer eine Eins-zu-eins-Entsprechung gibt zwischen den Operatoren in der Ausgabe der EXPLAIN-Einrichtung und den Operationen, die in der Ausgabe von db2expln und dynexpln angezeigt werden.

Unter den folgenden Themen wird der EXPLAIN-Text beschrieben, der von db2expln und dynexpln generiert werden kann:

Zugriff auf Tabellen

Diese Angabe zeigt den Namen und den Typ der Tabelle an, auf die zugegriffen wird. Es werden zwei Formate verwendet:

  1. Drei Typen von regulären Tabellen:
  2. Zwei Typen von temporären Tabellen:

Nach der Angabe über den Zugriff auf die Tabelle folgen weitere Angaben, die den Zugriff weiter beschreiben. Diese Angaben werden unter der Angabe über den Zugriff auf die Tabelle eingerückt. Folgende Angaben sind möglich:

Anzahl von Spalten

Die folgende Angabe zeigt die Anzahl von Spalten an, die aus jeder Zeile der Tabelle verwendet werden:

   #Columns = n

Paralleles Suchen

Die folgende Angabe zeigt an, daß der Datenbankmanager mehrere Subagenten zum parallelen Lesen aus der Tabelle verwendet:

   Parallel Scan

Wenn diese Angabe fehlt, wird die Tabelle nur von einem Agenten (bzw. Subagenten) gelesen.

Suchrichtung

Die folgende Angabe zeigt an, daß der Datenbankmanager Zeilen in umgekehrter Reihenfolge liest:

   Scan Direction = Reverse

Wenn dieser Text nicht angezeigt wird, wird in Vorwärtsrichtung gesucht (dies ist der Standardwert).

Zugriffsmethode für Zeilen

Eine der folgenden Angaben zur Art und Weise des Zugriffs auf die Zeilen in der Tabelle, die den angegebenen Kriterien entsprechen, wird angezeigt:

Geplante Sperren

Für jeden Tabellenzugriff wird die Art der Sperre, die auf Tabellen- und Zeilenebene aktiviert wird, mit der folgenden Angabe angezeigt:

   Lock Intents
   |  Table: xxxx
   |  Row  : xxxx

Folgende Werte sind für eine Tabellensperre möglich:

Folgende Werte sind für eine Zeilensperre möglich:

Eine Erläuterung dieser Arten von Sperren finden Sie in Attribute von Sperren.

Vergleichselemente

Es gibt zwei Angaben, die Informationen über die in einem Zugriffsplan verwendeten Vergleichselemente enthalten:

  1. Die folgende Angabe zeigt die Anzahl von Vergleichselementen, die ausgewertet werden, nachdem die Daten zurückgegeben wurden (d. h. Restvergleichselemente):
       Residual Predicate(s)
       |  #Predicates = n
    
  2. Die folgende Angabe zeigt die Anzahl von Vergleichselementen, die ausgewertet werden, während auf die Daten zugegriffen wird. Die Anzahl der Vergleichselemente läßt verschobene (Pushdown) Operationen wie Spaltenberechnung oder Sortierung unberücksichtigt.
       Sargable Predicate(s)
       |  #Predicates = n
    

Die Anzahl der in den obigen Angaben gezeigten Vergleichselemente spiegelt möglicherweise die Anzahl der Vergleichselemente der SQL-Anweisung aus folgenden Gründen nicht genau wider:

Verschiedene Tabellenangaben

Temporäre Tabellen

Eine temporäre Tabelle wird von einem Zugriffsplan während dessen Ausführung zum Speichern von Daten in einer temporären Arbeitstabelle oder Übergangstabelle verwendet. Die Tabelle existiert nur, solange der Zugriffsplan ausgeführt wird. Allgemein werden temporäre Tabellen verwendet, wenn Unterabfragen frühzeitig im Zugriffsplan ausgewertet werden müssen oder wenn Zwischenergebnisse nicht in den vorhandenen Speicher passen.

Wenn eine temporäre Tabelle erstellt werden muß, kann eine von zwei möglichen Angaben angezeigt werden. Diese Angaben weisen darauf hin, daß eine temporäre Tabelle erstellt und Zeilen in sie eingefügt werden. Die ID ist eine Kennung, die aus praktischen Gründen von db2expln zugeordnet wird, wenn auf die temporäre Tabelle Bezug genommen wird. Dieser ID wird als Präfix der Buchstabe 't' vorangestellt, um anzuzeigen, daß es sich um eine temporäre Tabelle handelt.

Nach jeder der oben gezeigten Angaben folgt die Angabe:

   #Columns = n

Diese Angabe zeigt die Anzahl der Spalten für jede Zeile, die in die temporäre Tabelle eingefügt wird.

Sortierte temporäre Tabellen

Sortierte temporäre Tabellen treten z. B. als Ergebnis folgender Operationen auf:

Eine Reihe zusätzlicher Angaben kann auf die ursprüngliche Angabe über die Erstellung für eine sortierte temporäre Tabelle folgen:

Abschließen der temporären Tabelle

Nach einem Tabellenzugriff, der eine verschobene (Pushdown) Operation zum Erstellen einer temporären Tabelle enthält (d. h. eine Operation zum Erstellen einer temporären Tabelle, die im Rahmen eines Tabellenzugriffs auftritt), folgt eine Abschlußangabe ("Completion"), die das Dateiende verarbeitet, indem sie die temporäre Tabelle darauf vorbereitet, Zeilen für den nachfolgenden Zugriff auf die temporäre Tabelle zur Verfügung zu stellen. Es wird eine der folgenden Zeilen angezeigt:

   Temp Table Completion  ID = tn
   Shared Temp Table Completion  ID = tn
   Sorted Temp Table Completion  ID = tn
   Sorted Shared Temp Table Completion  ID = tn

Tabellenfunktionen

Tabellenfunktionen sind benutzerdefinierte Funktionen (UDFs), die Daten in Form einer Tabelle an die Anweisung zurückgeben. Im Handbuch SQL Reference finden Sie weitere Informationen zu Tabellenfunktionen. Tabellenfunktionen werden durch die folgende Angabe angezeigt:

   Access User Defined Table Function
   |   Name = schema.funcname
   |   Language = xxxx
   |   Fenced   Deterministic   NULL Call   Disallow Parallel

Die Sprache (C, OLE oder Java), in der die Tabellenfunktion geschrieben ist, wird zusammen mit den Attributen der Tabellenfunktion angegeben.

Verknüpfungen

Es gibt drei Arten von Verknüpfungen (eine Beschreibung dieser Verknüpfungen finden Sie in Verknüpfungskonzepte):

Wenn bei der Ausführung eines Abschnitts der Zeitpunkt kommt, zu dem eine Verknüpfung ausgeführt wird, wird eine der folgenden Angaben angezeigt:

   Hash Join

oder

   Merge Join

oder

   Nested Loop Join

Es ist möglich, daß eine linke äußere Verknüpfung durchgeführt wird. Eine linke äußere Verknüpfung wird durch eine der folgenden Angaben angezeigt:

   Left Outer Hash Join

oder

   Left Outer Merge Join

oder

   Left Outer Nested Loop Join

Bei Mischverknüpfungen und Verknüpfungen über Verschachtelungsschleife ist die äußere Tabelle der Verknüpfung die Tabelle, auf die in der vorherigen Zugriffsangabe, die in der Ausgabe angezeigt wird, verwiesen wird. Die innere Tabelle bei dieser Verknüpfung ist die Tabelle, auf die in der Zugriffsangabe verwiesen wird, die sich im Bereich der Verknüpfungsangabe befindet. Bei Hash-Verknüpfungen sind die Zugriffsangaben umgekehrt, d. h. die äußere Tabelle ist im Verknüpfungsbereich enthalten, und die innere Tabelle wird vor der Verknüpfung angezeigt.

Bei einer Hash- oder Mischverknüpfung können folgende weitere Angaben auftreten:

Bei einer Hash-Verknüpfung können folgende weitere Angaben auftreten:

Bei einer Verknüpfung über Verschachtelungsschleife kann die folgende zusätzliche Angabe direkt nach der Verknüpfungsangabe angezeigt werden:

   Piped Inner

Diese Angabe bedeutet, daß die innere Tabelle der Verknüpfung das Ergebnis einer anderen Reihe von Operationen ist. Dies wird auch als eine zusammengesetzte innere (composite inner) Tabelle bezeichnet.

Wenn eine Verknüpfung mehr als zwei Tabellen umfaßt, müssen die EXPLAIN-Schritte von oben nach unten gelesen werden. Angenommen, die EXPLAIN-Ausgabe hat folgende Struktur:

   Access ..... W
   Join
   |  Access ..... X
   Join
   |  Access ..... Y
   Join
   |  Access ..... Z

Die Ausführung würde in diesem Fall in folgenden Schritten ablaufen:

  1. Abrufen einer den Kriterien entsprechenden Zeile aus W
  2. Verknüpfen der Zeile aus W mit (der nächsten) Zeile aus X und Benennung des Ergebnisses als P1 (für Verknüpfungsteilergebnis Nr. 1)
  3. Verknüpfung von P1 mit der (nächsten) Zeile aus Y zum Erstellen von P2
  4. Verknüpfung von P2 mit der (nächsten) Zeile aus Z zum Erstellen einer vollständigen Ergebniszeile
  5. Wenn weitere Zeilen in Z sind, weiter mit Schritt 4
  6. Wenn weitere Zeilen in Y sind, weiter mit Schritt 3
  7. Wenn weitere Zeilen in X sind, weiter mit Schritt 2
  8. Wenn weitere Zeilen in W sind, weiter mit Schritt 1

Datenströme

In einem Zugriffsplan ist es oft erforderlich, die Erstellung und den Fluß von Daten von einer Reihe von Operationen zur anderen zu steuern. Das Konzept des Datenstroms erlaubt es, eine Gruppe von Operationen innerhalb eines Zugriffsplans als Einheit zu steuern. Der Beginn eines Datenstroms wird durch folgende Angabe gekennzeichnet:

   Data Stream n

Hierbei ist n eine eindeutige Kennung, die zur leichteren Bezugnahme von db2expln zugeordnet wird. Das Ende des Datenstroms wird durch folgende Angabe gekennzeichnet:

   End of Data Stream n

Alle Operationen zwischen diesen Angaben werden als Teil desselben Datenstroms angesehen.

Ein Datenstrom hat eine Anzahl von Merkmalen, und auf die einleitende Datenstromangabe können eine oder mehrere Angaben folgen, um diese Merkmale zu beschreiben:

Wenn auf einen Datenstrom zugegriffen wird, wird die folgende Angabe in der Ausgabe angezeigt:

   Access Data Stream n

Einfügen, Aktualisieren und Löschen

Der EXPLAIN-Text für diese SQL-Anweisungen ist selbsterklärend. Nachfolgend sind mögliche Texte für diese SQL-Operationen dargestellt:

Vorbereitung von Satzkennungen (Satz-IDs)

Für einige Zugriffspläne ist es effizienter, wenn die den Kriterien entsprechenden Satz-IDs (RIDs) sortiert und mehrfach auftretende Werte entfernt werden (bei OR-Verknüpfung von Indizes) bzw. wenn eine Technik verwendet wird, mit der RIDs, die in allen betroffenen Indizes auftreten (bei AND-Verknüpfung von Indizes), identifiziert werden, bevor der tatsächliche Zugriff auf die Tabelle erfolgt. Es gibt drei Hauptgründe für die Vorbereitung von Satz-IDs, auf die in den EXPLAIN-Angaben hingewiesen wird:

Bei jeder Art von Satz-ID-Vorbereitung wird die Möglichkeit, daß ein Vorablesezugriff über Listen erfolgen kann, mit folgender Angabe angezeigt:

   Prefetch: Enabled

Spaltenberechnungen

Spaltenberechnungen (Aggregation) werden für die Zeilen vorgenommen, die den etwaigen, in den Vergleichselementen der SQL-Anweisungen festgelegten Kriterien entsprechen. Wenn eine Art von Spaltenfunktion auszuführen ist, wird eine der folgenden Angaben angezeigt:

   Aggregation
   Predicate Aggregation
   Partial Aggregation
   Partial Predicate Aggregation
   Intermediate Aggregation
   Intermediate Predicate Aggregation
   Final Aggregation
   Final Predicate Aggregation

Die Angabe Predicate aggregation besagt, daß die Spaltenberechnungsoperation zur Verarbeitung als Vergleichselement, wenn auf die Daten wirklich zugegriffen wird, verschoben wurde.

Unter jeder der oben aufgeführten Angaben über Spaltenberechnungen befindet sich eine Angabe, die die Art der durchgeführten Spaltenfunktion anzeigt:

Die spezifische Spaltenfunktion kann von der ursprünglichen SQL-Anweisung abgeleitet werden. Ein einzelner Satz (Single Record) wird aus einem Index abgerufen, um eine Operation MIN oder MAX auszuführen.

Wenn eine Spaltenberechnung über Vergleichselemente verwendet wird, folgt auf die Angabe über den Tabellenzugriff, in der die Spaltenberechnung auftrat, eine Angabe über den Abschluß der Spaltenberechnung, die alle erforderlichen Verarbeitungsschritte bei Gruppenende bzw. bei Dateiende vornimmt. Dazu wird eine der folgenden Zeilen in der Ausgabe angezeigt:

   Aggregation Completion
   Partial Aggregation Completion
   Intermediate Aggregation Completion
   Final Aggregation Completion

Parallelverarbeitung

Für die parallele Ausführung einer SQL-Anweisung (entweder mit partitionsinterner oder partitionsübergreifender Parallelität) sind einige besondere Operationen erforderlich. Die Operationen für Parallelpläne werden im folgenden beschrieben.

Verarbeitung von Anweisungen in zusammengeschlossenen Datenbanken

Für die Ausführung einer SQL-Anweisung in einer zusammengeschlossenen Datenbank ist die Fähigkeit erforderlich, Teile der betreffenden Anweisung in bezug auf andere Datenquellen auszuführen.

Im folgenden wird angegeben, daß auf eine Datenquelle zugegriffen wird:

   Distributed Subquery #n
   |  #Columns = n

Es ist möglich, daß Vergleichselemente auf die Daten angewandt werden, die von der verteilten Unterabfrage (Distributed Subquery) zurückgegeben wurden. Die Anzahl der Vergleichselemente (Predicates), die angewandt werden, wird folgendermaßen angezeigt:

Residual Predicate(s)
   |  #Predicates = n

Die Einzelheiten für die verteilten Unterabfragen werden getrennt bereitgestellt. Die Optionen für verteilte Unterabfragen werden nachfolgend beschrieben:

Verschiedene Angaben


[ Seitenanfang | Vorherige Seite | Nächste Seite | Inhaltsverzeichnis | Index ]