Wenn Sie SQL-Abfragen verwenden, um Daten nachzuschlagen, verwendet Spanner automatisch sekundäre Indexe, die wahrscheinlich beim Abrufen der Daten helfen effizienter gestalten. In einigen Fällen wählt Spanner jedoch möglicherweise einen Index aus, wodurch Abfragen langsamer werden. 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 von Abfragen erkennen
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 verschiedene Tools verwenden, um eine bestimmte Abfrage zu identifizieren, Spanner führt die Ausführung langsamer als üblich aus:
- Abfragestatistiken und Abfragestatistiken
Anwendungsspezifische Messwerte, die mit Cloud Monitoring erfasst und analysiert werden Sie können beispielsweise den Messwert Anzahl der Abfragen überwachen, um die Anzahl der Abfragen in einer Instanz im Verlauf der Zeit zu ermitteln und herauszufinden, welche Version der Abfrageoptimierung verwendet wurde.
Clientseitige Monitoring-Tools zur Messung der Anwendungsleistung
Hinweis zu neuen Datenbanken
Wenn Sie neu erstellte Datenbanken mit frisch eingefügten oder importierten Daten abfragen, Spanner wählt möglicherweise nicht die am besten geeigneten Indexe aus, da der Es dauert bis zu drei Tage, bis mit dem Abfrageoptimierungstool Statistiken zum Optimierungstool erfasst werden automatisch. Um die Indexnutzung einer neuen Spanner-Datenbank früher als dass Sie manuell ein neues Statistikpaket erstellen.
Schema überprü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. Bestimmen Sie, ob einer der Indexe die von Ihnen abgefragten Spalten enthält. bedeutet, dass Spanner einen der Indexe verwenden kann, um die Abfrage zu verarbeiten.
- Wenn anwendbare Indexe vorhanden sind, besteht der nächste Schritt darin, den Index zu ermitteln, Für die Abfrage verwendeter Spanner.
Sind keine anwendbaren Indexe vorhanden, prüfen Sie mit dem Befehl
gcloud spanner operations list
, ob Sie vor Kurzem einen entsprechenden Index gelöscht haben:gcloud spanner operations list \ --instance=INSTANCE \ --database=DATABASE \ --filter="@TYPE:UpdateDatabaseDdlMetadata"
Wenn Sie einen anwendbaren Index gelöscht haben, hat dies möglicherweise die Abfrageleistung negativ beeinflusst. Fügen Sie den sekundären Index dann wieder zur Tabelle hinzu. Nachher fügt Spanner den Index hinzu, führt die Abfrage erneut aus die Leistung. Verbessert sich die Leistung nicht, besteht der nächste Schritt darin, die Leistung zu ermitteln, Index, den Spanner für die Abfrage verwendet hat.
Wenn Sie keinen anwendbaren Index gelöscht haben, war die Indexauswahl nicht für den Rückgang der Abfrageleistung verantwortlich. Prüfen Sie dann eventuelle andere Änderungen an Ihren Daten oder Nutzungsmustern, die sich möglicherweise auf die Leistung ausgewirkt haben.
Den für eine Abfrage verwendeten Index finden
Um herauszufinden, welchen Index Spanner zum Verarbeiten einer Abfrage verwendet, rufen Sie den Abfrageausführungsplan in der Google Cloud Console:
Rufen Sie in der Google Cloud Console die Seite Spanner-Instanzen auf.
Klicken Sie auf den Namen der Instanz, die Sie abfragen möchten.
Klicken Sie im linken Bereich auf die Datenbank, die Sie abfragen möchten, und klicken Sie dann auf
Spanner Studio.Geben Sie die Abfrage ein, die geprüft werden soll.
Wählen Sie aus der Drop-down-Liste Abfrage ausführen die Option Nur Erklärung aus. 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 Spanner keinen sekundären Index verwenden:
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 Spanner eine sekundärer Index bei der Verarbeitung der Abfrage:
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 einigen Fällen verwendet Spanner einen Index, der nur einen Teil der Spalten, die die Abfrage auswählt. Daher muss Spanner mit dem Index verknüpft werden durch die Basistabelle.
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
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
Nachdem Sie den Index gefunden haben, den Spanner für Ihre Abfrage verwendet hat, führen Sie den Befehl aus
mit einem anderen Index ausführen
oder die Basistabelle scannen, anstatt
mithilfe eines Index. 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.
- Die Abfrage prüft auf Übereinstimmung mit einem Präfix des Primärschlüssels der Basistabelle (z. B.
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 Google Cloud Console, um die aktualisierte Abfrage zu testen und herauszufinden, wie lange bis die Abfrage verarbeitet wird.
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.
So testen Sie die aktualisierte Abfrage in der Google Cloud Console:
Rufen Sie in der Google Cloud Console die Seite Spanner-Instanzen auf.
Klicken Sie auf den Namen der Instanz, die Sie abfragen möchten.
Klicken Sie im linken Bereich auf die Datenbank, die Sie abfragen möchten, und klicken Sie dann auf
Spanner Studio.Geben Sie die Abfrage ein, die getestet werden soll, einschließlich der Anweisung
FORCE_INDEX
und klicken Sie auf Abfrage ausführen.In der Google Cloud Console wird der Tab Ergebnistabelle geöffnet. die Abfrageergebnisse, einschließlich der Dauer des um die Anfrage zu verarbeiten.
Dieser Messwert enthält keine anderen Latenzquellen wie die Zeit bis die Google Cloud Console die Daten Abfrageergebnisse.
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, stellt einen Kommunikationskanal mit der Spanner-Datenbank dar. Service.
- Klicken Sie auf
projects.instances.databases.sessions.create
. 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\]
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.
- Klicken Sie auf
projects.instances.databases.sessions.executeSql
. 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]
Verwenden Sie Folgendes für Request body (Requesttext):
{ "sql": "[YOUR_SQL_QUERY]", "queryMode": "PROFILE" }
Klicken Sie auf Ausführen. Die zurückgegebene Antwort enthält die Abfrageergebnisse, den Abfrageplan und die Ausführungsstatistiken für die Abfrage.