Einen Abfrageplan erstellen und interpretieren - Amazon Redshift

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Einen Abfrageplan erstellen und interpretieren

Sie können den Abfrageplan verwenden, um Informationen über die Einzeloperationen zu erhalten, die zur Ausführung einer Abfrage benötigt werden. Wir empfehlen, sich zunächst mit den Grundlagen der Verarbeitung von Abfragen und der Erstellung von Abfrageplänen durch Amazon Redshift vertraut zu machen, bevor Sie mit Abfrageplänen arbeiten. Weitere Informationen finden Sie unter Workflow der Abfrageplanung und -ausführung.

Um einen Abfrageplan zu erstellen, führen Sie einen EXPLAIN-Befehl, gefolgt von der Abfragetext, aus. Der Abfrageplan enthält die folgenden Informationen:

  • Von unten nach oben gelesen erhalten Sie die Operationen, die die Ausführungs-Engine durchführt.

  • Welche Art von Schritten jede Operation ausführt

  • Für jede Operation die verwendeten Tabellen und Spalten

  • Für jede Operation, welches Datenvolumen verarbeitet wird (als Anzahl Spalten, sowie die Datenbreite in Bytes)

  • Die relativen Kosten der Operation. Die Kosten sind ein Maß für den Vergleich der relativen Ausführungsdauer der Schritte in einem Plan. Die Kosten geben keinen Aufschluss über die tatsächliche Ausführungsdauer oder den Speicherverbrauch und ermöglichen auch keinen Vergleich zwischen Ausführungsplänen. Die Kosten weisen vielmehr darauf hin, welche Operationen in einer Abfrage die meisten Ressourcen verbrauchen.

Der EXPLAIN Befehl führt die Abfrage nicht wirklich aus. Der Befehl zeigt lediglich den Plan an, den Amazon Redshift ausführt, wenn die Abfrage unter den aktuellen Betriebsbedingungen ausgeführt wird. Wenn Sie für eine Tabelle das Schema oder Daten ändern und dann erneut ANALYZE ausführen, um die statistischen Metadaten zu aktualisieren, sieht der Abfrageplan möglicherweise anders aus.

Der von ausgegebene Abfrageplan EXPLAIN ist eine vereinfachte, allgemeine Ansicht der Abfrageausführung. Die Details zur parallelen Verarbeitung der Abfragen werden nicht angezeigt. Um detaillierte Informationen anzuzeigen, führen Sie die Abfrage selbst aus und rufen Sie dann die zusammenfassenden Informationen zur Abfrage aus der REPORT Ansicht SVL QUERY _ SVL _ SUMMARY oder QUERY _ _ ab. Weitere Informationen zur Verwendung dieser Ansichten finden Sie unter Analysieren des Abfragezusammenfassung.

Das folgende Beispiel zeigt die EXPLAIN Ausgabe für eine einfache GROUP BY-Abfrage in der EVENT Tabelle:

explain select eventname, count(*) from event group by eventname; QUERY PLAN ------------------------------------------------------------------- XN HashAggregate (cost=131.97..133.41 rows=576 width=17) -> XN Seq Scan on event (cost=0.00..87.98 rows=8798 width=17)

EXPLAINgibt die folgenden Metriken für jeden Vorgang zurück:

Kosten

Ein relativer Wert, mit dem sich die Operationen in einem Plan vergleichen lassen. Die kosten werden repräsentiert als zwei Dezimalzahlen, die durch zwei Punkte getrennt sind, beispielsweise cost=131.97..133.41. Der erste Wert (in diesem Fall 131,97) gibt die relativen Kosten für die Rückgabe der ersten Zeile für diese Operation an. Der zweite Wert (in diesem Fall 133,41) gibt die relativen Kosten für die Ausführung der gesamten Operation an. Die Kosten im Abfrageplan werden beim Lesen des Plans kumuliert, sodass die HashAggregate Kosten in diesem Beispiel (131,97.. 133,41) die Kosten für den darunter liegenden Seq-Scan enthalten (0,00.. 87,98).

Rows

Die geschätzte Anzahl der zurückzugebenden Zeilen. In diesem Beispiel wird erwartet, dass der Scan 8798 Zeilen zurückgibt. Es wird erwartet, dass der HashAggregate Operator allein 576 Zeilen zurückgibt (nachdem doppelte Ereignisnamen aus der Ergebnismenge verworfen wurden).

Anmerkung

Die Schätzung der Zeilen basiert auf den verfügbaren Statistiken, die durch den Befehl generiert wurden. ANALYZE Wenn ANALYZE die Schätzung in letzter Zeit nicht ausgeführt wurde, ist sie weniger zuverlässig.

Width

Die geschätzte Breite der Zeilen, in Bytes. In diesem Beispiel wird eine durchschnittliche Zeilenbreite von 17 Bytes erwartet.

EXPLAINBetreiber

In diesem Abschnitt werden kurz die Operatoren beschrieben, die Sie in der EXPLAIN Ausgabe am häufigsten sehen. Eine vollständige Liste der Operatoren finden Sie EXPLAIN im Abschnitt SQL Befehle.

Sequenzieller Scan-Operator

Der sequenzielle Scan-Operator (Seq Scan) scannt eine Tabelle. Seq Scan scannt jede Spalte in der Tabelle sequentiell von Anfang bis Ende und wertet Abfrageeinschränkungen (in der WHERE Klausel) für jede Zeile aus.

Join-Operatoren

Amazon Redshift wählt Join-Operatoren abhängig vom physischen Design der Tabellen, für die die Join-Operation ausgeführt wird, vom Speicherort der Daten, die für den Join benötigt werden, und von den spezifischen Anforderungen der Abfrage selbst aus.

  • Nested Loop

    Dies ist der am wenigsten optimale Join; wird vor allem für Kreuz-Joins (kartesische Produkte) und einige Ungleichheits-Joins verwendet.

  • Hash-Join und Hash

    Hash-Joins und Hashes werden in der Regel schneller ausgeführt als ein Join über eine verschachtelte Schleife, und werden für innere linke Joins sowie für äußere linke und rechte Joins verwendet. Diese Operatoren werden bei Join-Operationen für Tabellen verwendet, bei denen die Join-Spalten nicht sowohl Verteilungsschlüssel als auch Sortierschlüssel sind. Hash-Joins erstellen die Hash-Tabelle für die innere Tabelle des Verbunds. Der Hash-Join-Operator liest die äußere Tabelle, erstellt einen Hash für die Spalte, über die verbunden wird, durchsucht die innere Hash-Tabelle nach Übereinstimmungen.

  • Merge Join

    In der Regel die schnellste Join-Variante, wird für innere und äußere Joins verwendet. Der Zusammenführungs-Join ermöglicht nicht die Erstellung eines vollständigen Joins. Der Operator wird bei Join-Operationen für Tabellen verwendet, bei denen die Join-Spalten sowohl Verteilungsschlüssel als auch Sortierschlüssel sind und weniger als 20 % der Tabellen für die Join-Operation unsortiert sind. Bei dieser Operation werden zwei sortierte Tabellen sequentiell eingelesen und die übereinstimmenden Zeilen gesucht. Um den Prozentsatz unsortierter Zeilen anzuzeigen, führen Sie eine Abfrage über der Systemtabelle SVV_TABLE_INFO aus.

  • Räumlicher Join

    In der Regel ein schneller Join, der auf der Nähe von räumlichen Daten basiert und für die Datentypen GEOMETRY und GEOGRAPHY verwendet wird.

Aggregat-Operatoren

Der Abfrageplan verwendet die folgenden Operatoren in Abfragen, die Aggregatfunktionen und GROUP BY-Operationen beinhalten.

  • Aggregate

    Operator für skalare Aggregatfunktionen wie AVG undSUM.

  • HashAggregate

    Operator für unsortierte, gruppierte Aggregat-Funktionen.

  • GroupAggregate

    Operator für sortierte, gruppierte Aggregat-Funktionen.

Sortieroperatoren

In dem Abfrageplan werden die folgenden Operatoren verwendet, wenn in Abfragen Ergebnissätze sortiert oder zusammengeführt werden sollen.

  • Sortierung

    ORDERWertet die BY-Klausel und andere Sortieroperationen aus, z. B. Sortiervorgänge, die für UNION Abfragen und Verknüpfungen, SELECT DISTINCT Abfragen und Fensterfunktionen erforderlich sind.

  • Mischen von

    Erstellt die abschließenden sortierten Ergebnisse auf der Basis zwischenzeitlicher sortierter Ergebnisse, die aus den parallel ausgeführten Operationen abgeleitet werden.

UNIONINTERSECT, und Operatoren EXCEPT

Der Abfrageplan verwendet die folgenden Operatoren für Abfragen, die Mengenoperationen mit UNIONINTERSECT, und beinhaltenEXCEPT.

  • Unterabfrage

    Wird zum Ausführen von UNION Abfragen verwendet.

  • Hash Intersect Distinct

    Wird zum Ausführen von INTERSECT Abfragen verwendet.

  • SetOp Außer

    Wird zum Ausführen EXCEPT (oderMINUS) von Abfragen verwendet.

Andere Operatoren

Die folgenden Operatoren kommen auch häufig in der EXPLAIN Ausgabe von Routineabfragen vor.

  • Eindeutig

    Entfernt Duplikate für SELECT DISTINCT Abfragen und UNION Abfragen.

  • Limit

    Verarbeitet die LIMIT Klausel.

  • Window

    Führt Fensterfunktionen aus.

  • Ergebnis

    Führt skalare Funktionen aus, für die kein Tabellenzugriff erforderlich ist.

  • Subplan

    Wird für bestimmte Unterabfragen verwendet.

  • Netzwerk

    Sendet Zwischenergebnisse zur weiteren Verarbeitung an den Führungsknoten zurück.

  • Materialize

    Speichert Zeilen als Eingabe für Joins mit verschachtelten Schleifen und einige Zusammenführungs-Joins.

Schließt sich an EXPLAIN

Der Abfrageoptimierer verwendet verschiedene Varianten von Join-Operationen, je nachdem, wie die Abfrage und die zugrundeliegenden Tabellen strukturiert sind. Die EXPLAIN Ausgabe referenziert den Join-Typ, die verwendeten Tabellen und die Art und Weise, wie die Tabellendaten über den Cluster verteilt sind, um zu beschreiben, wie die Abfrage verarbeitet wird.

Beispiele für Join-Varianten

Die folgenden Beispiele zeigen die verschiedene Join-Varianten, die dem Abfrageoptimierer zur Verfügung stehen. Die Join-Variante in dem Abfrageplan hängt vom physischen Design der beteiligten Tabellen ab.

Beispiel: Hash-Join zweier Tabellen

Die folgende Abfrage verknüpft EVENT und bezieht sich CATEGORY auf die CATID Spalte. CATIDist der Verteilungs- und Sortierschlüssel fürCATEGORY, aber nicht fürEVENT. Ein Hash-Join wird EVENT als äußere Tabelle und CATEGORY als innere Tabelle ausgeführt. Da CATEGORY es sich um die kleinere Tabelle handelt, sendet der Planer während der Abfrageverarbeitung mithilfe von DS_ _ BCAST eine Kopie davon an die Rechenknoten. INNER Die Kosten für die Join-Operation machen den Großteil der kumulierten Kosten für den Plan aus.

explain select * from category, event where category.catid=event.catid; QUERY PLAN ------------------------------------------------------------------------- XN Hash Join DS_BCAST_INNER (cost=0.14..6600286.07 rows=8798 width=84) Hash Cond: ("outer".catid = "inner".catid) -> XN Seq Scan on event (cost=0.00..87.98 rows=8798 width=35) -> XN Hash (cost=0.11..0.11 rows=11 width=49) -> XN Seq Scan on category (cost=0.00..0.11 rows=11 width=49)
Anmerkung

Ausgerichtete Einrückungen für Operatoren in der EXPLAIN Ausgabe weisen manchmal darauf hin, dass diese Operationen nicht voneinander abhängen und parallel beginnen können. Im vorherigen Beispiel sind der Scan der EVENT Tabelle und der Hashvorgang zwar aufeinander abgestimmt, der EVENT Scan muss jedoch warten, bis der Hashvorgang vollständig abgeschlossen ist.

Beispiel: Zusammenführungs-Join zweier Tabellen

Die folgende Abfrage verwendet ebenfalls SELECT *, verknüpft aber die LISTID Spalte SALES und LISTING verknüpft sie, wobei sowohl der Verteilungs- als auch der Sortierschlüssel für beide Tabellen festgelegt LISTID wurde. Es wird eine Zusammenführungsverknüpfung ausgewählt, und für die Verknüpfung ist keine Neuverteilung der Daten erforderlich (DS_ DIST _NONE).

explain select * from sales, listing where sales.listid = listing.listid; QUERY PLAN ----------------------------------------------------------------------------- XN Merge Join DS_DIST_NONE (cost=0.00..6285.93 rows=172456 width=97) Merge Cond: ("outer".listid = "inner".listid) -> XN Seq Scan on listing (cost=0.00..1924.97 rows=192497 width=44) -> XN Seq Scan on sales (cost=0.00..1724.56 rows=172456 width=53)

Das folgende Beispiele illustriert die verschiedene Join-Varianten in derselben Abfrage. Wie im vorherigen Beispiel LISTING werden beide SALES zusammengeführt, aber die dritte Tabelle muss mit den Ergebnissen des Merge-Joins Hash-verknüpft werden. EVENT Auch hier fallen für den Hash-Join Kosten für die Rundsendung von Daten an.

explain select * from sales, listing, event where sales.listid = listing.listid and sales.eventid = event.eventid; QUERY PLAN ---------------------------------------------------------------------------- XN Hash Join DS_BCAST_INNER (cost=109.98..3871130276.17 rows=172456 width=132) Hash Cond: ("outer".eventid = "inner".eventid) -> XN Merge Join DS_DIST_NONE (cost=0.00..6285.93 rows=172456 width=97) Merge Cond: ("outer".listid = "inner".listid) -> XN Seq Scan on listing (cost=0.00..1924.97 rows=192497 width=44) -> XN Seq Scan on sales (cost=0.00..1724.56 rows=172456 width=53) -> XN Hash (cost=87.98..87.98 rows=8798 width=35) -> XN Seq Scan on event (cost=0.00..87.98 rows=8798 width=35)

Beispiel: Join-, Aggregat- und Sortieroperationen

Die folgende Abfrage führt eine Hash-Verknüpfung der EVENT Tabellen SALES und aus, gefolgt von Aggregations- und Sortieroperationen, um die gruppierte SUM Funktion und die ORDER BY-Klausel zu berücksichtigen. Der erste Sortieroperator wird parallel auf den Datenverarbeitungsknoten ausgeführt. Anschließend sendet der Network-Operator die Ergebnisse an den Führungsknoten, wo sie mit einer Merge-Operation zu einem sortierten Endergebnis zusammengeführt werden.

explain select eventname, sum(pricepaid) from sales, event where sales.eventid=event.eventid group by eventname order by 2 desc; QUERY PLAN --------------------------------------------------------------------------------- XN Merge (cost=1002815366604.92..1002815366606.36 rows=576 width=27) Merge Key: sum(sales.pricepaid) -> XN Network (cost=1002815366604.92..1002815366606.36 rows=576 width=27) Send to leader -> XN Sort (cost=1002815366604.92..1002815366606.36 rows=576 width=27) Sort Key: sum(sales.pricepaid) -> XN HashAggregate (cost=2815366577.07..2815366578.51 rows=576 width=27) -> XN Hash Join DS_BCAST_INNER (cost=109.98..2815365714.80 rows=172456 width=27) Hash Cond: ("outer".eventid = "inner".eventid) -> XN Seq Scan on sales (cost=0.00..1724.56 rows=172456 width=14) -> XN Hash (cost=87.98..87.98 rows=8798 width=21) -> XN Seq Scan on event (cost=0.00..87.98 rows=8798 width=21)

Datenumverteilung

Die EXPLAIN Ausgabe für Verknüpfungen gibt auch eine Methode an, wie Daten innerhalb eines Clusters verschoben werden, um die Verknüpfung zu erleichtern. Diese Datenbewegung kann entweder eine Rundsendung oder eine Umverteilung sein. Bei einer Rundsendung werden die Datenwerte von der einen Seite des Joins von jedem Verarbeitungsknoten an jeden anderen Verarbeitungsknoten gesendet, sodass jeder Verarbeitungsknoten am Ende der Operation eine vollständige Kopie der Daten hat. Bei einer Umverteilung werden die jeweiligen Datenwerte von ihrer aktuellen Slice an eine neue Slice gesendet, die sich möglicherweise auf einem anderen Knoten befindet. Die Daten werden normalerweise entsprechend dem Verteilungsschlüssel der anderen Tabelle des Joins umverteilt, wenn eine der Spalten der Join-Operation dieser Verteilungsschlüssel ist. Wenn keine der beiden Tabellen Verteilungsschlüssel in der jeweils anderen Tabelle hat, werden entweder beide Tabellen verteilt, oder die innere Tabelle wird an alle Knoten rundgesendet.

Die EXPLAIN Ausgabe verweist auch auf innere und äußere Tabellen. Die innere Tabelle wird zuerst gescannt und wird weiter unten im Abfrageplan angezeigt. Die innere Tabelle ist die Tabelle, in der nach Übereinstimmungen gesucht wird. Sie wird normalerweise im Speicher gehalten und als Quelltabelle für Hash-Operationen verwendet. Falls möglich wird die kleiner der beiden Tabellen als innere Tabelle verwendet. Der äußeren Tabelle werden die Zeilen entnommen für die in der inneren Tabelle nach Übereinstimmungen gesucht wird. Sie wird normalerweise vom Datenträger gelesen. Der Abfrageoptimierer wählt die innere und äußere Tabelle auf der Grundlage von Datenbankstatistiken aus der letzten Ausführung des ANALYZE Befehls aus. Die Reihenfolge der Tabellen in der FROM Klausel einer Abfrage bestimmt nicht, welche Tabelle innerlich und welche äußerlich ist.

Die folgenden Attribute in Abfrageplänen ermöglichen zu identifizieren, welche Daten bei der Ausführung einer Abfrage bewegt werden:

  • DS_ _ BCAST INNER

    Es wird eine Kopie der gesamten inneren Tabelle an alle Verarbeitungsknoten rundgesendet.

  • DS_ _ _ DIST ALL NONE

    Es ist keine Umverteilung erforderlich, da die innere Tabelle bereits an jeden Knoten verteilt wurde, der verwendet. DISTSTYLE ALL

  • DS_ _ DIST NONE

    Es werden keine Tabellen umverteilt. Eine Zusammenstellung der Joins ist bereits möglich, weil die entsprechenden Slices verbunden werden, ohne dass Daten zwischen Knoten bewegt werden müssen.

  • DS_ _ DIST INNER

    Die innere Tabelle wird umverteilt.

  • DS_ _ DIST OUTER

    Die äußere Tabelle wird umverteilt.

  • DS_ _ _ DIST ALL INNER

    Die gesamte innere Tabelle wird auf ein einzelnes Segment umverteilt, da die äußere Tabelle verwendet. DISTSTYLE ALL

  • DS_ _ DIST BOTH

    Beide Tabellen werden umverteilt.