Fehlerbehebung bei Leistungsabfällen

Wenn Sie SQL-Abfragen zum Ermitteln von Daten verwenden, nutzt Cloud Spanner automatisch alle sekundären Indexe, die die Daten sehr wahrscheinlich effizienter abrufen. In manchen Fällen kann es aber vorkommen, dass Cloud Spanner einen Index auswählt, der Abfragen verlangsamt. Dies führt dann möglicherweise dazu, dass einige Abfragen langsamer als in der Vergangenheit ausgeführt werden.

Auf dieser Seite wird erläutert, wie Sie Änderungen der Ausführungsgeschwindigkeit von Abfragen ermitteln, den Plan zur Ausführung für diese Abfragen prüfen und bei Bedarf einen anderen Index für zukünftige Abfragen festlegen.

Änderungen der Ausführungsgeschwindigkeit der Abfrage ermitteln

Wenn Sie eine der folgenden Änderungen vornehmen, führt dies vermutlich zu einer Änderung der Ausführungsgeschwindigkeit der Abfrage:

  • Eine große Anzahl vorhandener Daten mit einem sekundären Index wird erheblich verändert.
  • Ein sekundärer Index wird hinzugefügt, geändert oder gelöscht.

Sie können mit unterschiedlichen Messwerten und Tools die Abfragen ermitteln, die von Cloud Spanner langsamer als gewöhnlich ausgeführt werden:

Schema prüfen

Nachdem Sie die Abfrage ermittelt haben, die langsamer ausgeführt wird, sehen Sie sich die SQL-Anweisung für die Abfrage an und identifizieren Sie die Tabellen, die die Anweisung verwendet, sowie die Spalten, die sie aus diesen Tabellen abruft.

Suchen Sie als Nächstes die sekundären Indexe für diese Tabellen. Prüfen Sie, ob einer der Indexe die von Ihnen abgefragten Spalten enthält. Wenn ja, bedeutet dies, dass Cloud Spanner möglicherweise einen der Indexe zur Verarbeitung der Abfrage verwendet.

Für eine Abfrage verwendeten Index ermitteln

Rufen Sie den Plan zur Abfrageausführung in der Google Cloud Console auf, um festzustellen, welchen Index Cloud Spanner zur Verarbeitung einer Abfrage verwendet:

  1. Rufen Sie in der Cloud Console die Seite Instanzen für Cloud Spanner auf.

    Zur Seite "Instanzen"

  2. Klicken Sie auf den Namen der Instanz, die Sie abfragen möchten.

  3. Klicken Sie im linken Bereich auf die Datenbank, die Sie abfragen möchten, und dann auf Abfrage.

  4. Geben Sie die Abfrage ein, die geprüft werden soll.

  5. Wählen Sie aus der Drop-down-Liste Abfrage ausführen die Option Nur Erklärung aus. Cloud Spanner zeigt den Abfrageplan an.

Suchen Sie im Abfrageplan nach mindestens einem der folgenden Operatoren:

  • Table Scan
  • Index Scan
  • Cross Apply oder Distributed Cross Apply

Die Bedeutung der einzelnen Operatoren wird in den folgenden Abschnitten erläutert.

Operator "Table Scan"

Der Operator Table Scan gibt an, dass Cloud Spanner keinen sekundären Index verwendet hat:

Bildschirm mit einem Operator

Angenommen, die Tabelle Albums enthält keine sekundären Indexe und Sie führen die folgende Abfrage aus:

SELECT AlbumTitle FROM Albums WHERE STARTS_WITH(AlbumTitle, "Now");

Da keine verwendbaren Indexe vorhanden sind, enthält der Abfrageplan einen Operator "Table Scan".

Operator "Index Scan"

Der Operator Index Scan gibt an, dass Cloud Spanner bei der Verarbeitung der Abfrage einen sekundären Index verwendet hat:

Bildschirm mit einem Operator

Angenommen, Sie fügen der Tabelle Albums einen Index hinzu:

CREATE INDEX AlbumsByAlbumTitle ON Albums(AlbumTitle);

Anschließend führen Sie die folgende Abfrage aus:

SELECT AlbumTitle FROM Albums WHERE STARTS_WITH(AlbumTitle, "Now");

Der Index AlbumsByAlbumTitle enthält AlbumTitle. Dies ist die einzige Spalte, die von der Abfrage ausgewählt wird. Daher enthält der Abfrageplan einen Operator "Index Scan".

Operator "Cross Apply"

In manchen Fällen verwendet Cloud Spanner einen Index, der nur einige der Spalten enthält, die von der Abfrage ausgewählt werden. Dann muss Cloud Spanner den Index mit der Basistabelle verknüpfen.

Wenn dieser Join-Typ auftritt, enthält der Abfrageplan den Operator Cross Apply oder Distributed Cross Apply mit den folgende Eingaben:

  • Operator "Index Scan" für den Index einer Tabelle
  • Operator "Table Scan" für die Tabelle, zu der der Index gehört

Bildschirm mit dem Operator

Angenommen, Sie fügen der Tabelle Albums einen Index hinzu:

CREATE INDEX AlbumsByAlbumTitle ON Albums(AlbumTitle);

Anschließend führen Sie die folgende Abfrage aus:

SELECT * FROM Albums WHERE STARTS_WITH(AlbumTitle, "Now");

Der Index AlbumsByAlbumTitle enthält AlbumTitle, die Abfrage wählt aber alle Spalten in der Tabelle aus, nicht nur AlbumTitle. Daher enthält der Abfrageplan den Operator "Distributed Cross Apply" mit einem "Index Scan" von AlbumsByAlbumTitle und einem "Table Scan" von Albums als Eingaben.

Anderen Index auswählen

Wenn Sie den Index ermittelt haben, den Cloud Spanner für Ihre Abfrage verwendet hat, versuchen Sie, die Abfrage mit einem anderen Index auszuführen oder in der Basistabelle zu suchen, anstatt einen Index zu verwenden. Wenn Sie den Index angeben möchten, fügen Sie eine FORCE_INDEX-Anweisung zur Abfrage hinzu.

Wenn Sie eine schnellere Version der Abfrage finden, aktualisieren Sie Ihre Anwendung, um die schnellere Version zu verwenden.

Leitlinien für die Auswahl eines Index

Mithilfe der folgenden Leitlinien können Sie festlegen, welcher Index für die Abfrage getestet werden soll:

  • Wenn Ihre Abfrage eines der angegebenen Kriterien erfüllt, verwenden Sie die Basistabelle anstelle eines sekundären Index:

    • Die Abfrage prüft auf Übereinstimmung mit einem Präfix des Primärschlüssels der Basistabelle (z. B. SELECT * FROM Albums WHERE SingerId = 1).
    • Eine große Anzahl von Zeilen erfüllt die Abfrageprädikate (z. B. SELECT * FROM Albums WHERE AlbumTitle != "There Is No Album With This Title").
    • Die Abfrage verwendet eine Basistabelle, die nur einige hundert Zeilen enthält.
  • Wenn die Abfrage ein sehr selektives Prädikat enthält (z. B. REGEXP_CONTAINS, STARTS_WITH, <, <=, >, >= oder !=), versuchen Sie es mit einem Index, der die gleichen Spalten enthält wie das Prädikat.

Aktualisierte Abfrage testen

Verwenden Sie die Cloud Console, um die aktualisierte Abfrage zu testen und um festzustellen, wie lange es dauert, die Abfrage zu verarbeiten.

Wenn Ihre Abfrage Abfrageparameter enthält und ein Abfrageparameter sehr viel häufiger an einige Werte gebunden ist als andere, binden Sie den Abfrageparameter mit einem dieser Werte in Ihre Tests ein. Beispiel: Wenn die Abfrage ein Prädikat wie z. B. WHERE country = @countryId enthält und fast alle Ihre Abfragen @countryId an den Wert US binden, dann binden Sie für Ihre Leistungstests @countryId an US. Ein solches Vorgehen hilft Ihnen bei der Optimierung der Abfragen, die Sie am häufigsten ausführen.

Zum Testen der aktualisierten Abfrage in der Cloud Console führen Sie die folgenden Schritte aus:

  1. Rufen Sie in der Cloud Console die Seite Instanzen für Cloud Spanner auf.

    Zur Seite "Instanzen"

  2. Klicken Sie auf den Namen der Instanz, die Sie abfragen möchten.

  3. Klicken Sie im linken Bereich auf die Datenbank, die Sie abfragen möchten, und dann auf Abfrage.

  4. Geben Sie die Abfrage ein, die getestet werden soll, einschließlich der Anweisung FORCE_INDEX und klicken Sie auf Abfrage ausführen.

    In der Cloud Console wird der Tab Ergebnistabelle geöffnet. Darin werden die Abfrageergebnisse angezeigt, einschließlich der Dauer der Verarbeitung der Abfrage durch den Cloud Spanner-Dienst.

    Dieser Messwert enthält keine anderen Latenzquellen wie etwa die Zeit für die Interpretation und für die Anzeige der Ergebnisse durch die Cloud Console.

Mit der REST API das detaillierte Profil einer Abfrage im JSON-Format abrufen

Standardmäßig werden bei einer Abfrage nur Anweisungsergebnisse zurückgegeben. Dies liegt daran, dass QueryMode auf NORMAL gesetzt ist. Wenn Sie detaillierte Ausführungsstatistiken in die Abfrageergebnisse aufnehmen möchten, legen Sie für QueryMode den Wert PROFILE fest.

Sitzung erstellen

Erstellen Sie vor dem Aktualisieren des Abfragemodus eine Sitzung als Kommunikationskanal mit dem Cloud Spanner-Datenbankdienst.

  1. Klicken Sie auf projects.instances.databases.sessions.create.
  2. Geben Sie die Projekt-ID, die Instanz-ID und die Datenbank-ID im folgenden Format an:

    projects/[PROJECT_ID]/instances/[INSTANCE_ID]/databases/[DATABASE_ID]
    
  3. Klicken Sie auf Ausführen. Die Antwort enthält die erstellte Sitzung in der folgenden Form:

    projects/[PROJECT_ID]/instances/[INSTANCE_ID]/databases/[DATABASE_ID]/sessions/[SESSION]
    

    Damit führen Sie das Abfrageprofil im nächsten Schritt aus. Die erstellte Sitzung bleibt nach einer Nutzung bis zur nächsten Verwendung für höchstens eine Stunde aktiv. Dann wird sie von der Datenbank gelöscht.

Abfrage profilieren

Aktivieren Sie den Modus PROFILE für die Abfrage.

  1. Klicken Sie auf projects.instances.databases.sessions.executeSql.
  2. Geben Sie unter Sitzung die ID der Sitzung ein, die Sie im vorherigen Schritt erstellt haben:

    projects/[PROJECT_ID]/instances/[INSTANCE_ID]/databases/[DATABASE_ID]/sessions/[SESSION]
    
  3. Verwenden Sie für Anfragetext Folgendes:

    {
      "sql": "[YOUR_SQL_QUERY]",
      "queryMode": "PROFILE"
    }
    
  4. Klicken Sie auf Ausführen. Die zurückgegebene Antwort enthält die Abfrageergebnisse, den Abfrageplan und die Ausführungsstatistiken für die Abfrage.