Abfrage mit dem Abfrageplan-Visualisierung optimieren

Mit der Abfrageplan-Visualisierung können Sie schnell die Struktur des Plans nachvollziehen, die von Cloud Spanner zum Bewerten einer Abfrage ausgewählt wurde. In diesem Leitfaden erfahren Sie, wie Sie diese visuelle Darstellung eines Abfrageplans verwenden können, um die Ausführung Ihrer Abfragen besser nachvollziehen zu können.

Hinweis

Lesen Sie sich die folgenden Informationen durch, um sich mit den in dieser Anleitung genannten Teilen der Cloud Console-Benutzeroberfläche vertraut zu machen:

Abfrage in der Cloud Console ausführen

  1. Rufen Sie in der Cloud Console die Seite Cloud Spanner-Instanzen auf.

    Zur Seite "VM-Instanzen"

  2. Wählen Sie den Namen der Instanz mit der Datenbank aus, die Sie abfragen möchten.

    In der Cloud Console wird die Seite Übersicht der Instanz angezeigt.

  3. Wählen Sie den Namen der Datenbank aus, die Sie abfragen möchten.

    In der Cloud Console wird die Seite Übersicht der Datenbank angezeigt.

  4. Klicken Sie im seitlichen Menü auf Abfrage.

    In der Cloud Console wird die Seite Abfrage der Datenbank angezeigt.

  5. Geben Sie die SQL-Abfrage in den Editorbereich ein.
  6. Klicken Sie auf Ausführen.

    Cloud Spanner führt die Abfrage aus.

  7. Klicken Sie auf den Tab Erklärung, um die Abfrageplan-Visualisierung anzuzeigen.

Einführung in den Abfrageeditor

Die Seite Abfrage enthält Abfrage-Tabs, auf denen Sie SQL-Abfrage- und DML-Anweisungen eingeben oder einfügen, diese für Ihre Datenbank ausführen und deren Ergebnisse und Abfrageausführungspläne aufrufen können. Die Schlüsselkomponenten der Seite Abfrage sind im folgenden Screenshot nummeriert.

Annotierte Abfrageseite.
Abbildung 7. Seite mit Anmerkungen in einer Abfrage
  1. Die Tableiste zeigt die geöffneten Tabs der Abfrage. Klicken Sie auf Neuer Tab, um einen neuen Tab zu erstellen.

    Die Tableiste enthält auch eine Liste von Abfragevorlagen, die Sie verwenden können, um Abfragen einzufügen, die Informationen zu Datenbankabfragen, Transaktionen, Lesevorgängen und mehr liefern. Weitere Informationen hierzu finden Sie unter Überblick über Tools zur Selbstbeobachtung.

  2. In der Editor-Befehlsleiste stehen folgende Optionen zur Verfügung:
    • Der Befehl Ausführen führt die im Bearbeitungsbereich eingegebenen Anweisungen aus und erzeugt Abfrageergebnisse auf dem Tab Ergebnisse und Abfrageausführungspläne auf dem Tab Erklärung. Ändern Sie das Standardverhalten über das Drop-down-Menü, um die Optionen Nur Ergebnisse oder Nur Erklärung zu verwenden.

      Wenn Sie etwas im Editor markieren, wird der Befehl Ausführen in Auswahl ausführen geändert, sodass Sie nur das ausführen können, was Sie ausgewählt haben.

    • Mit dem Befehl Abfrage löschen wird der gesamte Text im Editor gelöscht und die Untertabs Ergebnisse und Erklärung werden gelöscht.
    • Mit dem Befehl Formatabfrage werden Anweisungen im Editor so formatiert, dass sie leichter zu lesen sind.
    • Der Befehl Shortcuts zeigt die Tastenkürzel an, die Sie im Editor verwenden können.
    • Der Link Hilfe zu SQL-Abfragen öffnet einen Browsertab mit der Dokumentation zur SQL-Abfragesyntax.

    Abfragen werden automatisch überprüft, wenn sie im Editor aktualisiert werden. Wenn die Anweisungen gültig sind, wird in der Editor-Befehlszeile ein Bestätigungshäkchen und die Meldung Gültig angezeigt. Falls Probleme auftreten, wird eine Fehlermeldung mit Details angezeigt.

  3. Im Editor geben Sie SQL-Abfrage- und DML-Anweisungen ein. Sie sind farbcodiert. Für mehrzeilige Anweisungen werden automatisch Zeilennummern hinzugefügt.

    Wenn Sie mehr als eine Anweisung im Editor eingeben, müssen Sie nach jeder Anweisung ein abschließendes Semikolon verwenden, mit Ausnahme der letzten.

  4. Der untere Bereich eines Abfragetabs enthält drei Untertabs:
    • Auf dem Untertab Schema werden die Tabellen in der Datenbank und ihre Schemas angezeigt. Verwenden Sie die Kurzreferenz beim Erstellen von Anweisungen im Editor.
    • Auf dem Untertab Ergebnisse werden die Ergebnisse angezeigt, wenn Sie die Anweisungen im Editor ausführen. Bei Abfragen wird eine Ergebnistabelle und bei DML-Anweisungen wie INSERT und >UPDATE eine Nachricht zur Anzahl der betroffenen Zeilen angezeigt.
    • Auf dem Untertab Erklärung werden visuelle Grafiken der Abfragepläne angezeigt, die beim Ausführen der Anweisungen im Editor erstellt werden.
  5. Die Untertabs Ergebnisse und Erklärung bieten beide eine Anweisungsauswahl, mit der Sie die Anweisung auswählen können, deren Ergebnisse oder Abfrageplan Sie aufrufen möchten.

Einführung in die Abfrageplan-Visualisierung

Die Schlüsselkomponenten der Visualisierung sind im folgenden Screenshot annotiert und ausführlicher beschrieben. Nachdem Sie eine Abfrage auf einem Abfragetab ausgeführt haben, wählen Sie den Tab ERKLÄRUNG unter dem Abfrageeditor aus, um die Visualisierung des Abfrageausführungsplans zu öffnen.

Der Datenfluss im folgenden Diagramm ist von unten nach unten, d. h. alle Tabellen und Indexe befinden sich unten im Diagramm und die endgültige Ausgabe oben.

Annotierte Abfrageplan-Visualisierung
Abbildung 8. Annotierte Abfrageplan-Visualisierung.
  1. Die Visualisierung Ihres Plans kann abhängig von der ausgeführten Abfrage groß sein. Wenn Sie Details ein- und ausblenden möchten, wechseln Sie zur Auswahl Maximierte/kompakte Ansicht. Mit der Zoomsteuerung kannst du anpassen, wie viel von einem Plan du siehst.
  2. In der Algebra, in der erläutert wird, wie Cloud Spanner die Abfrage ausführt, wird als azyklischer Graph gezeichnet, wobei jeder Knoten einem Iterator entspricht, der Zeilen aus den Eingaben verbraucht und Zeilen für das zugehörige übergeordnete Element generiert. Ein Beispielplan ist in Abbildung 9 dargestellt. Klicken Sie auf das Diagramm, um eine erweiterte Ansicht einiger Plandetails aufzurufen.

    Screenshot-Miniaturansicht des visuellen Plans
    Abbildung 9. Beispiel für einen visuellen Plan (Zum Heranzoomen klicken)
    Vergrößerter Screenshot des visuellen Plans

    Jeder Knoten oder jede Karte im Graph stellt einen Iterator dar und enthält die folgenden Informationen:

    • Der Iteratorname. Ein Iterator verwendet Zeilen aus seiner Eingabe und erstellt Zeilen.
    • Laufzeitstatistiken geben Aufschluss darüber, wie viele Zeilen zurückgegeben wurden, wie hoch die Latenz war und wie viel CPU genutzt wurde.
    • Die folgenden visuellen Hinweise helfen Ihnen, potenzielle Probleme im Abfrageausführungsplan zu ermitteln.
    • Rote Balken in einem Knoten sind visuelle Indikatoren für den Prozentsatz der Latenz oder CPU-Zeit für diesen Iterator im Vergleich zur Summe für die Abfrage.
    • Die Stärke der Linien, die jeden Knoten verbinden, stellt die Zeilenanzahl dar. Je dicker die Linie, desto größer ist die Anzahl der Zeilen, die an den nächsten Knoten übergeben werden. Die tatsächliche Anzahl der Zeilen wird auf jeder Karte angezeigt, wenn Sie den Mauszeiger auf einen Connector bewegen.
    • Auf einem Knoten, auf dem ein vollständiger Tabellenscan durchgeführt wurde, wird ein Warndreieck angezeigt. Weitere Informationen im Infobereich umfassen Empfehlungen wie das Hinzufügen eines Index oder wenn möglich die Abfrage oder das Schema auf andere Weise überarbeiten, um einen vollständigen Scan zu vermeiden.
    • Wählen Sie eine Karte im Plan aus, um Details im Informationsfenster auf der rechten Seite aufzurufen (5).

  3. Die Miniübersicht des Ausführungsplans zeigt eine verkleinerte Ansicht des gesamten Plans an und ist nützlich, um die Gesamtform des Ausführungsplans zu bestimmen und schnell zu verschiedenen Teilen des Plans zu wechseln. Ziehen Sie den Mauszeiger direkt auf der Miniübersicht oder klicken Sie auf die Stelle, auf die Sie den Fokus richten möchten, um zu einem anderen Teil des visuellen Plans zu gelangen.
  4. Wählen Sie JSON HERUNTERLADEN aus, um eine JSON-Version des Ausführungsplans herunterzuladen. Dies ist hilfreich, wenn Sie sich an das Cloud Spanner-Team wenden, um Support zu erhalten.
  5. Im Informationsbereich werden detaillierte kontextbezogene Informationen zum ausgewählten Knoten im Diagramm des Abfrageplans angezeigt. Die Informationen sind in folgende Kategorien unterteilt.
    • Iterator-Informationen enthalten Details sowie Laufzeitstatistiken für die Iterator-Karte, die Sie im Graph ausgewählt haben.
    • Die Abfragezusammenfassung enthält Details zur Anzahl der zurückgegebenen Zeilen und zur Ausführungszeit der Abfrage. Hervorgehobene Operatoren sind solche, die eine erhebliche Latenz aufweisen, eine erhebliche Menge an CPU im Vergleich zu anderen Operatoren verbrauchen und eine erhebliche Anzahl von Datenzeilen zurückgeben.
    • Die Zeitachse der Abfrageausführung ist ein zeitbasierter Graph, der zeigt, wie lange jede Maschinengruppe ihren Teil der Abfrage ausgeführt hat. Es kann sein, dass eine Maschinengruppe nicht unbedingt für die gesamte Dauer der Abfrage ausgeführt wird. Es ist auch möglich, dass eine Maschinengruppe während der Ausführung der Abfrage mehrmals ausgeführt wurde. Die Zeitachse zeigt hier jedoch nur den Beginn der ersten Ausführung und das Ende der letzten Ausführung an.

Abfrage mit schlechter Leistung optimieren

Stellen Sie sich vor, Ihr Unternehmen betreibt eine Online-Filmdatenbank, die Informationen über Filme wie Besetzung, Produktionsfirmen, Filmdetails und mehr enthält. Der Dienst wird in Cloud Spanner ausgeführt, hat jedoch in letzter Zeit einige Leistungsprobleme festgestellt.

Als Hauptentwickler des Dienstes werden Sie aufgefordert, diese Leistungsprobleme zu untersuchen, da sie zu schlechten Bewertungen für den Dienst führen. Öffnen Sie die Cloud Console, gehen Sie zu Ihrer Datenbankinstanz und öffnen Sie dann den Abfrageeditor. Sie geben die folgende Abfrage in den Editor ein und führen sie aus.

SELECT
  t.title,
  MIN(t.production_year) AS year,
  ANY_VALUE(mc.note HAVING MIN t.production_year) AS note
FROM
  title AS t
JOIN
  movie_companies AS mc
ON
  t.id = mc.movie_id
WHERE
  t.title LIKE '% the %'
GROUP BY
  title;

Das Ergebnis dieser Abfrage ist im folgenden Screenshot dargestellt. Wir haben die Abfrage im Editor formatiert, indem wir FORMAT QUERY ausgewählt haben. Außerdem wird rechts oben auf dem Bildschirm ein Hinweis angezeigt, dass die Abfrage gültig ist.

Abfrageeditor mit Originalabfrage
Abbildung 1. Abfrageeditor mit ursprünglicher Abfrage.

Auf dem Tab RESULTS unter dem Abfrageeditor wird angezeigt, dass die Abfrage in etwas mehr als zwei Minuten abgeschlossen ist. Sie beschließen, die Abfrage genauer zu betrachten, um zu prüfen, ob sie effizient ist.

Langsame Abfrage mit der Abfrageplan-Visualisierung analysieren

An dieser Stelle wissen wir, dass die Abfrage im vorherigen Schritt mehr als zwei Minuten dauert, wir wissen jedoch nicht, ob die Abfrage so effizient wie möglich ist und ob diese Dauer daher erwartbar ist.

Wählen Sie den Tab ERKLÄRUNG direkt unter dem Abfrageeditor aus, um eine visuelle Darstellung des Ausführungsplans aufzurufen, den Cloud Spanner zum Ausführen der Abfrage und Zurückgeben der Ergebnisse erstellt hat.

Der im folgenden Screenshot dargestellte Plan ist relativ groß, aber auch bei dieser Zoomstufe können Sie die folgenden Beobachtungen machen.

  • Laut Zusammenfassung der Abfrage im rechten Bereich ermitteln wir, dass fast 3 Millionen Zeilen gescannt und letztendlich weniger als 64.000 Zeilen zurückgegeben wurden.

  • Im Bereich Zeitachse für die Abfrageausführung ist auch zu sehen, dass vier Maschinengruppen an der Abfrage beteiligt waren. Eine Maschinengruppe ist für die Ausführung eines Teils der Abfrage zuständig. Operatoren können auf einer oder mehreren Maschinen ausgeführt werden. Bei Auswahl einer Maschinengruppe in der Zeitachse wird im visuellen Plan hervorgehoben, welcher Teil der Abfrage für diese Gruppe ausgeführt wurde.

Abfrageplan-Visualisierung mit visueller Erläuterung der ursprünglichen Abfrage
Abbildung 2. Abfrageplan-Visualisierung mit dem visuellen Plan der ursprünglichen Abfrage.

Aufgrund dieser Faktoren entscheiden Sie, dass eine Leistungsverbesserung möglich ist, indem Sie den Join von einem Apply-Join, der von Cloud Spanner standardmäßig ausgewählt wurde, zu einem Hash-Join ändern.

Abfrage optimieren

Zur Verbesserung der Leistung einer Abfrage verwenden Sie einen Join-Hinweis, um die Join-Methode in einen Hash-Join zu ändern. Diese Join-Implementierung führt die satzbasierte Verarbeitung aus.

Die aktualisierte Abfrage sieht so aus:

SELECT
  t.title,
  MIN(t.production_year) AS year,
  ANY_VALUE(mc.note HAVING MIN t.production_year) AS note
FROM
  title AS t
JOIN
  @{join_method=hash_join} movie_companies AS mc
ON
  t.id = mc.movie_id
WHERE
  t.title LIKE '% the %'
GROUP BY
  title;

Der folgende Screenshot zeigt die aktualisierte Abfrage. Wie im Screenshot dargestellt, wurde die Abfrage in weniger als fünf Sekunden abgeschlossen, was eine deutliche Verbesserung in der Laufzeit von über 120 Sekunden vor dieser Änderung bedeutet.

Abfrageeditor mit verbesserter Abfrage
Abbildung 3. Abfrageeditor, der die verbesserte Abfrage anzeigt.

Sehen wir uns den neuen visuellen Plan an, der im folgenden Diagramm dargestellt ist, um zu erfahren, was er uns über diese Verbesserung verrät.

Abfragevisualisierung in der Cloud Console-UI
Abbildung 4. Abfrageplan-Visualisierung nach den Abfrageverbesserungen (zum Vergrößern klicken)

Vergrößerter Screenshot des visuellen Plans

Sie können augenblicklich einige Unterschiede bemerken:

  • An dieser Abfrageausführung war nur eine Maschinengruppe beteiligt.

  • Die Anzahl der Aggregationen wurde drastisch reduziert.

Fazit

In diesem Szenario haben wir eine langsame Abfrage ausgeführt und den visuellen Plan untersucht, um Ineffizienzen zu ermitteln. Im Folgenden finden Sie eine Zusammenfassung der Abfragen und Pläne vor und nach allen Änderungen. Auf jedem Tab wird die ausgeführte Abfrage und eine kompakte Ansicht der vollständigen Visualisierung des Abfrageausführungsplans angezeigt.

Vor

SELECT
  t.title,
  MIN(t.production_year) AS year,
  ANY_VALUE(mc.note
  HAVING
    MIN t.production_year) AS note
FROM
  title AS t
JOIN
  movie_companies AS mc
ON
  t.id = mc.movie_id
WHERE
  t.title LIKE '% the %'
GROUP BY
  title;
Kompakte Ansicht des visuellen Plans vor den Verbesserungen.
Abbildung 5: Kompakte Ansicht des visuellen Plans vor den Verbesserungen.

Nach

SELECT
  t.title,
  MIN(t.production_year) AS year,
  ANY_VALUE(mc.note
  HAVING
    MIN t.production_year) AS note
FROM
  title AS t
JOIN
  @{join_method=hash_join} movie_companies AS mc
ON
  t.id = mc.movie_id
WHERE
  t.title LIKE '% the %'
GROUP BY
  title;
Kompakte Ansicht des visuellen Plans nach den Verbesserungen.
Abbildung 6: Kompakte Ansicht des visuellen Plans nach den Verbesserungen.

Ein Indikator dafür, dass in diesem Szenario etwas verbessert werden könnte, war, dass ein großer Anteil der Zeilen aus der Tabelle Titel den Filter LIKE '% the %' qualifiziert hat. Die Suche in einer anderen Tabelle mit so vielen Zeilen ist wahrscheinlich teuer. Durch das Ändern unserer Join-Implementierung in einen Hash-Join wurde die Leistung erheblich verbessert.

Nächste Schritte