Aufgabe 7: Abbrechen einer Abfrage - Amazon Redshift

Aufgabe 7: Abbrechen einer Abfrage

Wenn Sie eine Abfrage ausführen, die zu lange dauert oder zu viele Clusterressourcen verbraucht, brechen Sie sie ab. Zum Beispiel: Erstellen Sie eine Liste von Ticketverkäufern, die die Namen der Verkäufer und die Anzahl der verkauften Tickets enthält. Die folgende Abfrage wählt Daten aus der SALES-Tabelle und der USERS-Tabelle aus und verbindet beide Tabellen durch den Abgleich von SELLERID und USERID in der WHERE-Klausel.

SELECT sellerid, firstname, lastname, sum(qtysold) FROM sales, users WHERE sales.sellerid = users.userid GROUP BY sellerid, firstname, lastname ORDER BY 4 desc;

Das Ergebnis sieht in etwa wie folgt aus.

sellerid | firstname | lastname | sum ----------+-----------+----------+------ 48950 | Nayda | Hood | 184 19123 | Scott | Simmons | 164 20029 | Drew | Mcguire | 164 36791 | Emerson | Delacruz | 160 13567 | Imani | Adams | 156 9697 | Dorian | Ray | 156 41579 | Harrison | Durham | 156 15591 | Phyllis | Clay | 152 3008 | Lucas | Stanley | 148 44956 | Rachel |Villarreal| 148
Anmerkung

Dies ist eine komplexe Abfrage. Für dieses Tutorial müssen Sie sich über den Aufbau dieser Abfrage keine Gedanken machen.

Die vorherige Abfrage dauert wenige Sekunden und gibt 2 102 Zeilen aus.

Angenommen, Sie hätten die WHERE-Klausel vergessen.

SELECT sellerid, firstname, lastname, sum(qtysold) FROM sales, users GROUP BY sellerid, firstname, lastname ORDER BY 4 desc;

Der Ergebnissatz enthält dann alle Zeilen in der SALES-Tabelle, multipliziert mit allen Zeilen in der USERS-Tabelle (49989*3766). Dies ist eine so genannte Cartesische Verbindung, die nicht zu empfehlen ist. Das Ergebnis sind mehr als 188 Millionen Zeichen, und die Verarbeitungszeit ist extrem lang.

Um eine laufende Abfrage abzubrechen, verwenden Sie den CANCEL-Befehl mit der PID der Abfrage.

Um die Prozess-ID zu finden, starten Sie eine neue Sitzung und fragen Sie die Tabelle STV_RECENTS ab, wie im vorherigen Schritt gezeigt. Das folgende Beispiel zeigt, wie Sie die Ergebnisse lesbarer machen können. Verwenden Sie dazu die TRIM-Funktion, um nachfolgende Leerzeichen abzuschneiden, und zeigen Sie nur die ersten 20 Zeichen der Abfragezeichenfolge an.

SELECT pid, trim(user_name), starttime, substring(query,1,20) FROM stv_recents WHERE status='Running';

Das Ergebnis sieht in etwa wie folgt aus.

pid | btrim | starttime | substring -------+------------+----------------------------+---------------------- 610 | adminuser | 2013-03-28 18:39:49.355918 | select sellerid, fir (1 row)

Führen Sie zum Abbrechen der Abfrage mit der PID 18764 den folgenden Befehl aus:

CANCEL 610;
Anmerkung

Der Befehl CANCEL stoppt eine Transaktion nicht. Um eine Transaktion zu stoppen oder rückgängig zu machen, müssen Sie den Befehl ABORT oder ROLLBACK verwenden. Um eine mit einer Transaktion verbundene Abfrage abzubrechen, brechen Sie zuerst die Abfrage ab und stoppen Sie dann die Transaktion.

Wenn die abgebrochene Abfrage mit einer Transaktion verbunden ist, verwenden Sie den Befehl ABORT oder ROLLBACK, um die Transaktion abzubrechen und alle an den Daten vorgenommen Änderungen zu verwerfen:

ABORT;

Sie können nur Ihre eigenen Abfragen abbrechen, sofern Sie nicht als Superuser angemeldet sind. Superuser können alle Abfragen abbrechen.

Abbrechen einer Abfrage aus einer anderen Sitzung

Wenn Ihr Abfragetool nicht die gleichzeitige Ausführung von Abfragen unterstützt, starten Sie zum Abbruch der Abfrage eine weitere Sitzung. Der Abfrage-Editor, den wir im Handbuch Erste Schritte mit Amazon Redshift verwenden, unterstützt beispielsweise nicht mehrere gleichzeitige Abfragen. Um eine weitere Sitzung mit dem Abfrage-Editor zu starten, wählen Sie File (Datei), New Window (Neues Fenster), und stellen Sie eine Verbindung mit denselben Verbindungsparametern her. Dann können Sie die PID finden und die Abfrage abbrechen.

Abbrechen einer Abfrage mit der Superuser-Warteschlange

Wenn in Ihrer aktuellen Sitzung zu viele Abfragen gleichzeitig ausgeführt werden, können Sie möglicherweise erst dann den CANCEL-Befehl ausführen, wenn eine andere Abfrage abgeschlossen ist. Führen Sie in diesem Fall den CANCEL-Befehl mit einer anderen WLM-Abfragewarteschlange aus.

WLM ermöglicht Ihnen die Ausführung von Abfragen in verschiedenen Abfragewarteschlangen, so dass Sie nicht warten müssen, bis eine andere Abfrage abgeschlossen ist. Der Workload Manager erstellt eine separate Warteschlange mit der Bezeichnung „Superuser-Warteschlange“, die Sie für Fehlerbehebungszwecke verwenden können. Um die Superuser-Warteschlange verwenden zu können, melden Sie sich als Superuser an und setzen Sie die Abfragegruppe mit dem SET-Befehl auf „Superuser“. Setzen Sie nach der Ausführung Ihrer Befehle die Abfragegruppe mit dem RESET-Befehl wieder zurück.

Führen Sie diese Befehle aus, um eine Abfrage mithilfe der Superuser-Warteschlange abzubrechen:

SET query_group TO 'superuser'; CANCEL 610; RESET query_group;