Abfragestatistiken

Cloud Spanner bietet integrierte Tabellen, in denen viele Statistiken für die CPU-intensivsten Abfragen sowie alle Abfragen insgesamt zusammengefasst werden.

Verfügbarkeit

SPANNER_SYS-Daten sind nur über SQL-Schnittstellen verfügbar. Beispiel:

  • Die Seite Abfrage einer Datenbank in der Cloud Console

  • Befehl gcloud spanner databases execute-sql

  • executeQuery API

Andere Cloud Spanner-Methoden für einzelne Leseaufrufe unterstützen SPANNER_SYS nicht.

Nach Abfrage gruppierte CPU-Nutzung

In den folgenden Tabellen werden die Abfragen mit der höchsten CPU-Auslastung während eines bestimmten Zeitraums nachverfolgt:

  • SPANNER_SYS.QUERY_STATS_TOP_MINUTE: Abfragen in Intervallen von 1 Minute
  • SPANNER_SYS.QUERY_STATS_TOP_10MINUTE: Abfragen in Intervallen von 10 Minuten
  • SPANNER_SYS.QUERY_STATS_TOP_HOUR: Abfragen in Intervallen von 1 Stunde

Diese Tabellen haben folgende Attribute:

  • Jede Tabelle enthält Daten für nicht überlappende Zeitintervalle in der Länge, die der Tabellenname festlegt.

  • Die Intervalle beziehen sich auf die Uhrzeit. 1-Minuten-Intervalle enden nach einer vollen Minute, 10-Minuten-Intervalle enden alle 10 Minuten ab Beginn der vollen Stunde, 1-Stunden-Intervalle enden zu jeder vollen Stunde.

    Beispielsweise sind die neuesten, für SQL-Abfragen verfügbaren Intervalle um 11:59:30 Uhr:

    • 1 Minute: 11:58:00–11:58:59 Uhr
    • 10 Minuten: 11:40:00–11:49:59 Uhr
    • 1 Stunde: 10:00:00–10:59:59 Uhr
  • Cloud Spanner gruppiert die Statistiken nach dem Text der SQL-Abfrage. Verwendet eine Abfrage Abfrageparameter, gruppiert Cloud Spanner alle Ausführungen der Abfrage in einer Zeile. Wenn die Abfrage String-Literale verwendet, gruppiert Cloud Spanner die Statistiken nur, wenn der vollständige Abfragetext identisch ist. Wenn sich der Text unterscheidet, wird jede Abfrage als separate Zeile angezeigt.

  • Jede Zeile enthält Statistiken für alle Ausführungen einer bestimmten SQL-Abfrage, für die Cloud Spanner während des angegebenen Intervalls Statistiken erfasst.

  • Wenn Cloud Spanner nicht alle Abfragen speichern kann, die während des Intervalls ausgeführt werden, priorisiert das System Abfragen mit der höchsten CPU-Auslastung im angegebenen Intervall.

  • Zu den verfolgten Abfragen gehören solche, die vom Nutzer abgeschlossen, fehlgeschlagen oder abgebrochen wurden.

  • Eine Teilmenge der Statistiken bezieht sich auf Abfragen, die ausgeführt, aber nicht abgeschlossen wurden:

    • Ausführungsanzahl und durchschnittliche Latenz in Sekunden für alle nicht erfolgreichen Abfragen

    • Anzahl der Ausführungen für Zeitüberschreitungen bei Abfragen.

    • Ausführungsanzahl für Abfragen, die vom Nutzer abgebrochen wurden oder aufgrund von Problemen mit der Netzwerkverbindung fehlgeschlagen sind.

Tabellenschema

Spaltenname Typ Beschreibung
INTERVAL_END TIMESTAMP Ende des Zeitintervalls, in dem die eingeschlossene Abfrage ausgeführt wurde
TEXT STRING SQL-Abfragetext, verkürzt auf ca. 64 KB
TEXT_TRUNCATED BOOL Ob der Abfragetext gekürzt wurde oder vollständig ist
TEXT_FINGERPRINT INT64 Hash des Abfragetextes
EXECUTION_COUNT INT64 Anzahl der von Cloud Spanner während des Intervalls registrierten Ausführungen einer Anfrage
AVG_LATENCY_SECONDS FLOAT64 Durchschnittliche Zeit in Sekunden für jede Abfrageausführung in der Datenbank. Die Codierungs- und Übertragungszeit für die Ergebnismenge sowie der Overhead werden ausgeschlossen.
AVG_ROWS FLOAT64 Durchschnittliche Anzahl der Zeilen, die die Abfrage zurückgegeben hat
AVG_BYTES FLOAT64 Durchschnittliche Anzahl der Datenbyte, die von der Abfrage zurückgegeben wurden, ohne den Overhead für die Übertragungscodierung.
AVG_ROWS_SCANNED FLOAT64 Durchschnittliche Anzahl der Zeilen, die von der Abfrage gescannt wurden, ausgenommen gelöschte Werte
AVG_CPU_SECONDS FLOAT64 Durchschnittliche Anzahl von Sekunden CPU-Zeit, die Cloud Spanner für alle Vorgänge zum Ausführen der Abfrage benötigt.
ALL_FAILED_EXECUTION_COUNT INT64 Häufigkeit, mit der die Abfrage während des Intervalls fehlgeschlagen ist.
ALL_FAILED_AVG_LATENCY_SECONDS FLOAT64 Durchschnittliche Dauer in Sekunden für jede Abfrageausführung, die in der Datenbank fehlgeschlagen ist. Dieser Durchschnittswert beinhaltet keine Codierungs- und Übertragungszeit für die Ergebnismenge sowie den Overhead.
CANCELLED_OR_DISCONNECTED_EXECUTION_COUNT INT64 Häufigkeit, mit der die Abfrage vom Nutzer abgebrochen wurde oder weil die Netzwerkverbindung während des Intervalls unterbrochen wurde
TIMED_OUT_EXECUTION_COUNT INT64 Die Häufigkeit, mit der die Abfrage während des Intervalls das Zeitlimit überschritten hat.

EXECUTION_COUNT und AVG_LATENCY_SECONDS für fehlgeschlagene Abfragen umfassen Abfragen, die aufgrund einer falschen Syntax oder eines vorübergehenden Fehlers fehlgeschlagen sind, die aber bei einem erneuten Versuch erfolgreich waren.

Zusammengefasste Statistiken

Außerdem gibt es Tabellen, in denen zusammengefasste Daten für alle Abfragen nachverfolgt werden, für die Cloud Spanner Statistiken für einen bestimmten Zeitraum erfasst:

  • SPANNER_SYS.QUERY_STATS_TOTAL_MINUTE: Abfragen in Intervallen von 1 Minute
  • SPANNER_SYS.QUERY_STATS_TOTAL_10MINUTE: Abfragen in Intervallen von 10 Minuten
  • SPANNER_SYS.QUERY_STATS_TOTAL_HOUR: Abfragen in Intervallen von 1 Stunde

Diese Tabellen haben folgende Attribute:

  • Jede Tabelle enthält Daten für nicht überlappende Zeitintervalle in der Länge, die der Tabellenname festlegt.

  • Die Intervalle beziehen sich auf die Uhrzeit. 1-Minuten-Intervalle enden nach einer vollen Minute, 10-Minuten-Intervalle enden alle 10 Minuten ab Beginn der vollen Stunde, 1-Stunden-Intervalle enden zu jeder vollen Stunde.

    Beispielsweise sind die neuesten, für SQL-Abfragen verfügbaren Intervalle um 11:59:30 Uhr:

    • 1 Minute: 11:58:00–11:58:59 Uhr
    • 10 Minuten: 11:40:00–11:49:59 Uhr
    • 1 Stunde: 10:00:00–10:59:59 Uhr
  • Jede Zeile enthält zusammengefasste Statistiken für alle Abfragen, die während des angegebenen Intervalls über die Datenbank ausgeführt werden. Es gibt nur eine Zeile pro Zeitintervall und enthält abgeschlossene Abfragen, fehlgeschlagene Abfragen und vom Nutzer abgebrochene Abfragen.

  • Die in den TOTAL-Tabellen erfassten Statistiken können Abfragen enthalten, die Cloud Spanner nicht in den TOP-Tabellen erfasst hat.

Tabellenschema

Spaltenname Typ Beschreibung
INTERVAL_END TIMESTAMP Ende des Zeitintervalls, in dem die eingeschlossene Abfrage ausgeführt wurde
EXECUTION_COUNT INT64 Anzahl der von Cloud Spanner während des Intervalls registrierten Ausführungen einer Anfrage
AVG_LATENCY_SECONDS FLOAT64 Durchschnittliche Zeit in Sekunden für jede Abfrageausführung in der Datenbank. Die Codierungs- und Übertragungszeit für die Ergebnismenge sowie der Overhead werden ausgeschlossen.
AVG_ROWS FLOAT64 Durchschnittliche Anzahl der Zeilen, die die Abfrage zurückgegeben hat
AVG_BYTES FLOAT64 Durchschnittliche Anzahl der Datenbyte, die von der Abfrage zurückgegeben wurden, ohne den Overhead für die Übertragungscodierung.
AVG_ROWS_SCANNED FLOAT64 Durchschnittliche Anzahl der Zeilen, die von der Abfrage gescannt wurden, ausgenommen gelöschte Werte
AVG_CPU_SECONDS FLOAT64 Durchschnittliche Anzahl von Sekunden CPU-Zeit, die Cloud Spanner für alle Vorgänge zum Ausführen der Abfrage benötigt.
ALL_FAILED_EXECUTION_COUNT INT64 Häufigkeit, mit der die Abfrage während des Intervalls fehlgeschlagen ist.
ALL_FAILED_AVG_LATENCY_SECONDS FLOAT64 Durchschnittliche Dauer in Sekunden für jede Abfrageausführung, die in der Datenbank fehlgeschlagen ist. Dieser Durchschnittswert beinhaltet keine Codierungs- und Übertragungszeit für die Ergebnismenge sowie den Overhead.
CANCELLED_OR_DISCONNECTED_EXECUTION_COUNT INT64 Häufigkeit, mit der die Abfrage vom Nutzer abgebrochen wurde oder weil die Netzwerkverbindung während des Intervalls unterbrochen wurde
TIMED_OUT_EXECUTION_COUNT INT64 Die Häufigkeit, mit der die Abfrage während des Intervalls das Zeitlimit überschritten hat.

Datenaufbewahrung

Cloud Spanner speichert die Daten für jede Tabelle mindestens für die folgenden Zeiträume:

  • SPANNER_SYS.QUERY_STATS_TOP_MINUTE und SPANNER_SYS.QUERY_STATS_TOTAL_MINUTE: Intervalle der letzten 6 Stunden.

  • SPANNER_SYS.QUERY_STATS_TOP_10MINUTE und SPANNER_SYS.QUERY_STATS_TOTAL_10MINUTE: Intervalle der letzten 4 Tage.

  • SPANNER_SYS.QUERY_STATS_TOP_HOUR und SPANNER_SYS.QUERY_STATS_TOTAL_HOUR: Intervalle der letzten 30 Tage.

Beispielabfragen

Dieser Abschnitt enthält mehrere Beispiel-SQL-Anweisungen, die Abfragestatistiken abrufen. Sie können diese SQL-Anweisungen mit den Clientbibliotheken, mit dem gcloud-Befehlszeilentool oder mit der Cloud Console ausführen.

Grundlegende Statistiken für jede Abfrage in einem bestimmten Zeitraum auflisten

Die folgende Abfrage gibt die Rohdaten für die Top-Abfragen der vorherigen Minute zurück:

SELECT text,
       interval_end,
       execution_count,
       avg_latency_seconds,
       avg_rows,
       avg_bytes,
       avg_rows_scanned,
       avg_cpu_seconds
FROM spanner_sys.query_stats_top_minute
ORDER BY interval_end DESC;

Abfragen mit der höchsten CPU-Nutzung auflisten

Die folgende Abfrage gibt die Abfragen mit der höchsten CPU-Nutzung der vorherigen Stunde zurück:

SELECT text,
       execution_count AS count,
       avg_latency_seconds AS latency,
       avg_cpu_seconds AS cpu,
       execution_count * avg_cpu_seconds AS total_cpu
FROM spanner_sys.query_stats_top_hour
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.query_stats_top_hour)
ORDER BY total_cpu DESC;

Gesamtausführungsanzahl in einem bestimmten Zeitraum ermitteln

Die folgende Abfrage gibt die Gesamtzahl der im letzten vollständigen 1-Minuten-Intervall ausgeführten Abfragen zurück:

SELECT interval_end,
       execution_count
FROM spanner_sys.query_stats_total_minute
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.query_stats_top_minute);

Durchschnittliche Latenzzeit für eine Abfrage ermitteln

Die folgende Abfrage gibt die durchschnittliche Latenzzeit für eine bestimmte Abfrage zurück:

SELECT avg_latency_seconds
FROM spanner_sys.query_stats_top_hour
WHERE text LIKE "SELECT x FROM table WHERE x=@foo;";

Abfragen finden, die die meisten Daten scannen

Sie können die Anzahl der von einer Abfrage gescannten Zeilen als Maß für die Datenmenge verwenden, die von der Abfrage gescannt wurde. Die folgende Abfrage gibt die Anzahl der Zeilen zurück, die von Abfragen gescannt wurden, die in der vorherigen Stunde ausgeführt wurden:

SELECT text,
       execution_count,
       avg_rows_scanned
FROM spanner_sys.query_stats_top_hour
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.query_stats_top_hour)
ORDER BY avg_rows_scanned DESC;

Gesamtsumme der CPU-Nutzung über alle Abfragen hinweg

Die folgende Abfrage gibt die Anzahl der in der vorherigen Stunde verwendeten CPU-Stunden zurück:

SELECT (avg_cpu_seconds * execution_count / 60 / 60)
  AS total_cpu_hours
FROM spanner_sys.query_stats_total_hour
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.query_stats_total_hour);

Abfragen auflisten, die in einem bestimmten Zeitraum fehlgeschlagen sind

Die folgende Abfrage gibt die Rohdaten zurück, einschließlich der Ausführungsanzahl und der durchschnittlichen Latenz fehlgeschlagener Abfragen für die häufigsten Abfragen der letzten Minute:

SELECT text,
       interval_end,
       execution_count,
       all_failed_execution_count,
       all_failed_avg_latency_seconds,
       avg_latency_seconds,
       avg_rows,
       avg_bytes,
       avg_rows_scanned,
       avg_cpu_seconds
FROM spanner_sys.query_stats_top_minute
WHERE all_failed_execution_count > 0
ORDER BY interval_end;

Gesamtfehleranzahl in einem bestimmten Zeitraum ermitteln

Die folgende Abfrage gibt die Gesamtzahl der Abfragen zurück, die im letzten vollständigen 1-Minuten-Intervall nicht ausgeführt werden konnten.

SELECT interval_end,
       all_failed_execution_count
FROM spanner_sys.query_stats_total_minute
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.query_stats_top_minute)
ORDER BY interval_end;

Abfragen mit der Zeitüberschreitung auflisten

Die folgende Abfrage gibt die Abfragen mit der höchsten Zeitüberschreitung in der vorherigen Stunde zurück.

SELECT text,
       execution_count AS count,
       timed_out_execution_count AS timeout_count,
       avg_latency_seconds AS latency,
       avg_cpu_seconds AS cpu,
       execution_count * avg_cpu_seconds AS total_cpu
FROM spanner_sys.query_stats_top_hour
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.query_stats_top_hour)
ORDER BY timed_out_execution_count DESC;

Durchschnittliche Latenz von erfolgreichen und fehlgeschlagenen Ausführungen für eine Abfrage ermitteln

Die folgende Abfrage gibt die kombinierte durchschnittliche Latenz, die durchschnittliche Latenz für erfolgreiche Ausführungen und die durchschnittliche Latenz für fehlgeschlagene Ausführungen für eine bestimmte Abfrage zurück.

SELECT avg_latency_seconds AS combined_avg_latency,
       all_failed_avg_latency_seconds AS failed_execution_latency,
       ( avg_latency_seconds * execution_count -
         all_failed_avg_latency_seconds * all_failed_execution_count
       ) / (
       execution_count - all_failed_execution_count ) AS success_execution_latency
FROM   spanner_sys.query_stats_top_hour
WHERE  text LIKE "select x from table where x=@foo;";

Fehlerbehebung bei hoher CPU-Auslastung oder erhöhter Abfragelatenz durch Abfragestatistiken

Abfragestatistiken sind nützlich, wenn Sie eine hohe CPU-Nutzung in Ihrer Cloud Spanner-Datenbank untersuchen oder nur die CPU-intensiven Abfrageformen in Ihrer Datenbank verstehen möchten. Wenn Sie Abfragen prüfen, die erhebliche Datenbankressourcen in Anspruch nehmen, können Cloud Spanner-Nutzer möglicherweise die Betriebskosten senken und möglicherweise die allgemeinen Systemlatenzen verbessern. In den folgenden Schritten wird gezeigt, wie Sie mithilfe von Abfragestatistiken die hohe CPU-Auslastung in Ihrer Datenbank untersuchen können.

Im folgenden Beispiel liegt der Schwerpunkt auf der CPU-Nutzung. In ähnlicher Weise können ähnliche Schritte ausgeführt werden, um die Abfragelatenz zu erhöhen und Abfragen mit den höchsten Latenzen zu finden. Wählen Sie einfach Zeitintervalle und Abfragen nach Latenz aus, anstatt nach CPU-Auslastung zu suchen.

Zeitraum auswählen, der untersucht werden soll

Starten Sie die Prüfung mit der Suche nach einem Zeitpunkt, an dem Ihre Anwendung begann, eine hohe CPU-Auslastung zu verzeichnen. Beispiel: Das Problem tritt um 17:00 Uhr am 24. Juli 2020 (UTC) auf.

Abfragestatistiken für den ausgewählten Zeitraum werden abgerufen

Nachdem ein Zeitraum zum Starten der Prüfung ausgewählt wurde, betrachten wir die Statistikdaten, die etwa zu diesem Zeitpunkt in der Tabelle QUERY_STATS_TOTAL_10MINUTE gesammelt wurden. Die Ergebnisse dieser Abfrage können darauf hinweisen, wie sich die CPU- und andere Abfragestatistiken während dieses Zeitraums geändert haben.

Die folgende Abfrage gibt die zusammengefassten Abfragestatistiken von 16:30 bis einschließlich 17:30 UTC zurück. Wir verwenden in der Abfrage ROUND, um die Anzahl der Dezimalstellen für die Anzeige einzuschränken.

SELECT interval_end,
       execution_count AS count,
       ROUND(avg_latency_seconds,2) AS latency,
       ROUND(avg_rows,2) AS rows_returned,
       ROUND(avg_bytes,2) AS bytes,
       ROUND(avg_rows_scanned,2) AS rows_scanned,
       ROUND(avg_cpu_seconds,3) AS avg_cpu
FROM spanner_sys.query_stats_total_10minute
WHERE
  interval_end >= "2020-07-24T16:30:00Z"
  AND interval_end <= "2020-07-24T17:30:00Z"
ORDER BY interval_end;

Das Ausführen der Abfrage führte zu den folgenden Ergebnissen.

interval_end count Latenz row_returned Byte Zeilen_gescannt avg_cpu [CPU]
2020-07-24T16:30:00Z 6 0,06 5,00 536,00 16,67 0,035
2020-07-24T16:40:00Z 55 0,02 0.22 25,29 0.22 0,004
2020-07-24T16:50:00Z 102 0,02 0,30 33,35 0,30 0,004
2020-07-24T17:00:00Z 154 1.06 4.42 486.33 7792208.12 4.633
2020-07-24T17:10:00Z 94 0,02 1,68 106,84 1,68 0,006
2020-07-24T17:20:00Z 110 0,02 0,38 34,60 0,38 0,005
2020-07-24T17:30:00Z 47 0,02 0.23 24,96 0.23 0,004

In der obigen Tabelle sehen Sie, dass die durchschnittliche CPU-Zeit, die Spalte avg_cpu in der Ergebnistabelle, in den hervorgehobenen Intervallen um 17:00 Uhr am höchsten ist. Wir ermitteln darüber hinaus eine viel höhere Anzahl von Zeilen, die durchschnittlich gescannt werden. Dies bedeutet, dass teurere Abfragen zwischen 16:50 und 17:00 Uhr ausgeführt wurden. Wir wählen das Intervall aus, um es im nächsten Schritt genauer zu untersuchen.

Ermitteln, welche Abfragen zu einer hohen CPU-Auslastung führen

Mit einem Zeitintervall, das geprüft werden soll, fragen wir nun die QUERY_STATS_TOP_10MINUTE-Tabelle ab. Die Ergebnisse dieser Abfrage können Aufschluss darüber geben, welche Abfragen eine hohe CPU-Auslastung verursachen.

SELECT text_fingerprint AS fingerprint,
       execution_count AS count,
       ROUND(avg_latency_seconds,2) AS latency,
       ROUND(avg_cpu_seconds,3) AS cpu,
       ROUND(execution_count * avg_cpu_seconds,3) AS total_cpu
FROM spanner_sys.query_stats_top_10MINUTE
WHERE
  interval_end = "2020-07-24T17:00:00Z"
ORDER BY total_cpu DESC;

Das Ausführen dieser Abfrage führt zu folgenden Ergebnissen:

Fingerabdruck count Latenz CPU total_cpu
5505124206529314852 30 3.88 17.635 529.039
1697951036096498470 10 4.49 18.388 183.882
2295109096748351518 1 0,33 0,048 0,048
11618299167612903606 1 0,25 0,021 0,021
10302798842433860499 1 0,04 0,006 0,006
123771704548746223 1 0,04 0,006 0,006
4216063638051261350 1 0,04 0,006 0,006
3654744714919476398 1 0,04 0,006 0,006
2999453161628434990 1 0,04 0,006 0,006
823179738756093706 1 0,02 0,005 0.0056

Die beiden häufigsten Abfragen, die in der Ergebnistabelle hervorgehoben werden, sind Ausreißer in Bezug auf die durchschnittliche CPU- und Latenz sowie die Anzahl der Ausführungen und die CPU-Gesamtzahl. Betrachten wir die erste Abfrage, die in diesen Ergebnissen aufgeführt ist, genauer.

Abfrageausführungen im Zeitverlauf vergleichen

Nachdem wir die Untersuchung eingegrenzt haben, können wir uns der Tabelle QUERY_STATS_TOP_MINUTE widmen. Durch den Vergleich der Läufe für eine bestimmte Abfrage im Zeitverlauf können wir nach Korrelationen zwischen der Anzahl der zurückgegebenen Zeilen oder Byte oder der Anzahl der gescannten und erhöhten CPU- oder Latenzraten suchen. Eine Abweichung kann auf eine Ungleichmäßigkeit der Daten hinweisen. Eine durchgehend hohe Anzahl von gescannten Zeilen kann darauf hinweisen, dass keine entsprechenden Indexe oder keine optimale Join-Reihenfolge vorhanden sind.

Betrachten wir die Abfrage mit der höchsten durchschnittlichen CPU-Auslastung und der höchsten Latenz. Wir führen die folgende Anweisung aus, die nach dem Text-Fingerabdruck dieser Abfrage filtert.

SELECT interval_end,
       ROUND(avg_latency_seconds,2) AS latency,
       avg_rows AS rows_returned,
       avg_bytes AS bytes_returned,
       avg_rows_scanned AS rows_scanned,
       ROUND(avg_cpu_seconds,3) AS cpu,
FROM spanner_sys.query_stats_top_minute
WHERE text_fingerprint = 5505124206529314852
ORDER BY interval_end DESC;

Das Ausführen dieser Abfrage gibt die folgenden Ergebnisse zurück.

interval_end Latenz row_returned bytes_returned Zeilen_gescannt CPU
2020-07-24T17:00:00Z 4.55 21 2365 30000000 19,255
2020-07-24T16:00:00Z 3,62 21 2365 30000000 17,255
2020-07-24T15:00:00Z 4,37 21 2365 30000000 18,350
2020-07-24T14:00:00Z 4,02 21 2365 30000000 17,748
2020-07-24T13:00:00Z 3.12 21 2365 30000000 16,380
2020-07-24T12:00:00Z 3,45 21 2365 30000000 15,476
2020-07-24T11:00:00Z 4,94 21 2365 30000000 22,611
2020-07-24T10:00:00Z 6,48 21 2365 30000000 21,265
2020-07-24T09:00:00Z 0.23 21 2365 5 0,040
2020-07-24T08:00:00Z 0,04 21 2365 5 0,021
2020-07-24T07:00:00Z 0,09 21 2365 5 0,030

Bei der Analyse der vorhergehenden Ergebnisse haben wir festgestellt, dass sich die Anzahl der gescannten Zeilen, die CPU-Auslastung und die Latenz etwa um 9:00 Uhr erheblich geändert haben. Um zu verstehen, warum diese Zahlen so drastisch ansteigen, untersuchen wir den Abfragetext und prüfen, ob sich Änderungen im Schema auf die Abfrage ausgewirkt haben.

Verwenden Sie die folgende Abfrage, um den Abfragetext für die Abfrage abzurufen, die wir untersuchen.

SELECT text,
       text_truncated
FROM spanner_sys.query_stats_top_hour
WHERE text_fingerprint = 5505124206529314852
LIMIT 1;

Dadurch wird das folgende Ergebnis zurückgegeben.

text text_truncated
Select * aus Aufträgen mit o_custkey = 36901; false

Wenn Sie den zurückgegebenen Abfragetext prüfen, erkennen Sie, dass die Abfrage nach einem Feld namens o_custkey filtert. Dies ist eine Nicht-Schlüsselspalte in der Tabelle orders. Früher gab es auf dieser Spalte einen Index, der um 9:00 Uhr gesunken war. Dies erklärt die Kostenänderungen für diese Abfrage. Wir können den Index wieder hinzufügen oder bei fehlender Abfrageausführung den Index ausschließen und die höheren Lesekosten akzeptieren.

Unsere Untersuchung konzentrierte sich bisher auf Abfragen, die erfolgreich abgeschlossen wurden, und fanden einen Grund, warum die Datenbank eine Leistungsverschlechterung hatte. Im nächsten Schritt konzentrieren wir uns auf fehlgeschlagene oder abgebrochene Abfragen und zeigen, wie Sie die Daten untersuchen können, um weitere Informationen zu erhalten.

Fehlgeschlagene Abfragen untersuchen

Abfragen, die nicht abgeschlossen werden, verbrauchen dennoch Ressourcen, bevor sie das Zeitlimit erreichen, abgebrochen werden oder anderweitig fehlschlagen. Cloud Spanner verfolgt die Anzahl der Ausführungen und die Ressourcen, die von fehlgeschlagenen Abfragen verbraucht wurden, zusammen mit den erfolgreichen Abfragen.

Um zu prüfen, ob fehlgeschlagene Abfragen einen erheblichen Beitrag zur Systemauslastung leisten, prüfen wir zuerst, wie viele Abfragen im Zeitintervall von Interesse fehlgeschlagen sind.

SELECT interval_end,
       all_failed_execution_count AS failed_count,
       all_failed_avg_latency_seconds AS latency
FROM spanner_sys.query_stats_total_minute
WHERE
  interval_end >= "2020-07-24T16:50:00Z"
  AND interval_end <= "2020-07-24T17:00:00Z"
ORDER BY interval_end;
interval_end fehlgeschlagen_Anzahl Latenz
2020-07-24T16:52:00Z 1 15.211391
2020-07-24T16:53:00Z 3 58,312232

Wir können weiter nach Abfragen suchen, die mit der folgenden Abfrage am ehesten fehlschlagen.

SELECT interval_end,
       text_fingerprint,
       execution_count,
       avg_latency_seconds AS avg_latency,
       all_failed_execution_count AS failed_count,
       all_failed_avg_latency_seconds AS failed_latency,
       cancelled_or_disconnected_execution_count AS cancel_count,
       timed_out_execution_count AS to_count
FROM spanner_sys.query_stats_top_minute
WHERE all_failed_execution_count > 0
ORDER BY interval_end;
interval_end text_fingerprint execution_count fehlgeschlagen_Anzahl abbrechen to_count [Anzahl_der_Anzahl]
2020-07-24T16:52:00Z 5505124206529314852 3 1 1 0
2020-07-24T16:53:00Z 1697951036096498470 2 1 1 0
2020-07-24T16:53:00Z 5505124206529314852 5 2 1 1

Wie in der obigen Tabelle gezeigt, ist die Abfrage mit dem Fingerabdruck 5505124206529314852 in unterschiedlichen Zeitintervallen mehrmals fehlgeschlagen. Angesichts eines Musters mit Fehlern wie diesem ist es dann interessant, die Latenz der erfolgreichen und fehlgeschlagenen Ausführungen zu vergleichen.

SELECT interval_end,
       avg_latency_seconds AS combined_avg_latency,
       all_failed_avg_latency_seconds AS failed_execution_latency,
       ( avg_latency_seconds * execution_count -
         all_failed_avg_latency_seconds * all_failed_execution_count
       ) / (
       execution_count - all_failed_execution_count ) AS success_execution_latency
FROM   spanner_sys.query_stats_top_hour
WHERE  text_fingerprint = 5505124206529314852;
interval_end Combined_avg_latency fehlgeschlagene_Ausführungslatenz success_Ausführungslatenz
2020-07-24T17:00:00Z 3,880420 13,830709 2,774832

Best Practices anwenden

Nachdem wir eine mögliche Abfrage zur Optimierung ermittelt haben, können wir als Nächstes das Abfrageprofil untersuchen und versuchen, die Gebote mithilfe der Best Practices für SQL zu optimieren.

Nächste Schritte