Arbeiten mit asynchronen untergeordneten Aufträgen¶
In diesem Thema wird erklärt, wie Sie asynchrone untergeordnete Aufträge in Snowflake Scripting verwenden.
Einführung in asynchrone untergeordnete Aufträge¶
In Snowflake Scripting ist ein asynchroner untergeordneter Auftrag eine Abfrage, die im Hintergrund ausgeführt wird, während der Code in einem Block weiterläuft. Die Abfrage kann jede gültige SQL-Anweisung sein, einschließlich SELECT-Anweisungen und DML-Anweisungen wie INSERT oder UPDATE.
Um eine Abfrage als asynchronen untergeordneten Auftrag auszuführen, setzen Sie das Schlüsselwort ASYNC vor die Abfrage. Wenn dieses Schlüsselwort weggelassen wird, führt der Snowflake Scripting-Block die untergeordneten Aufträge nacheinander aus und jeder untergeordnete Auftrag wartet auf das Ende des laufenden untergeordneten Auftrags, bevor er beginnt. Asynchrone untergeordnete Aufträge können gleichzeitig ausgeführt werden, was die Effizienz verbessern und die Gesamtlaufzeit verkürzen kann.
Sie können das Schlüsselwort ASYNC auf die folgenden Arten verwenden:
Für eine Abfrage, die für ein RESULTSET ausgeführt wird.
Für eine Abfrage, die unabhängig von einem RESULTSET ausgeführt wird.
Um asynchrone untergeordnete Aufträge zu verwalten, verwenden Sie die Anweisungen AWAIT und CANCEL:
Die Anweisung AWAIT wartet auf die Beendigung aller laufenden asynchronen untergeordneten Aufträge oder auf die Beendigung eines bestimmten untergeordneten Auftrags, der für ein RESULTSET läuft, und kehrt dann zurück, wenn alle Aufträge bzw. der bestimmte Auftrag beendet sind.
Die Anweisung CANCEL bricht einen asynchronen untergeordneten Auftrag ab, der für ein RESULTSET läuft.
Sie können den Status eines asynchronen untergeordneten Auftrags, der für ein RESULTSET läuft, überprüfen, indem Sie die Funktion SYSTEM$GET_RESULTSET_STATUS aufrufen.
Derzeit können bis zu 4.000 asynchrone untergeordnete Aufträge gleichzeitig ausgeführt werden. Ein Fehler wird zurückgegeben, wenn die Anzahl der gleichzeitigen asynchronen untergeordneten Aufträge diese Grenze überschreitet.
Bemerkung
Wenn mehrere asynchrone untergeordnete Aufträge gleichzeitig in derselben Sitzung ausgeführt werden, ist die Reihenfolge der Beendigung des Auftrags erst bekannt, wenn die Aufträge abgeschlossen sind. Da die Reihenfolge der Fertigstellung variieren kann, ist die Verwendung der Funktion LAST_QUERY_ID mit asynchronen untergeordneten Aufträgen nicht deterministisch.
Beispiele für die Verwendung asynchroner untergeordneter Aufträge¶
In den folgenden Abschnitten finden Sie Beispiele für die Verwendung asynchroner untergeordneter Aufträge:
Beispiel: Ausführen von untergeordneten Jobs mit gleichzeitiger Abfrage von Tabellen
Beispiel: Ausführen von untergeordneten Jobs, die gleichzeitig Zeilen in Tabellen einfügen
Beispiel: Untergeordnete Aufträge für Einfügungen in einer Schleife ausführen
Beispiel: Ausführen von untergeordneten Jobs mit gleichzeitiger Abfrage von Tabellen¶
Der folgende Code zeigt, wie Sie das Schlüsselwort ASYNC verwenden, um mehrere untergeordnete Jobs auszuführen, die gleichzeitig Tabellen abfragen. Das Beispiel gibt das Schlüsselwort ASYNC für Abfragen an, die für RESULTSETs ausgeführt werden.
Dieses Beispiel verwendet die Daten in den folgenden Tabellen:
Die folgende gespeicherte Prozedur führt die folgenden Aktionen aus:
Fragt beide Tabellen nach den
order_amount-Werten in allen Zeilen ab und gibt die Ergebnisse an verschiedene RESULTSETs zurück (eins für jede Tabelle).Legt fest, dass die Abfragen als gleichzeitige untergeordnete Jobs ausgeführt werden, indem Sie das Schlüsselwort ASYNC verwenden.
Führt die AWAIT-Anweisung für jedes RESULTSET aus, sodass die Prozedur wartet, bis die Abfragen beendet sind, bevor sie fortfährt. Auf die Abfrageergebnisse für ein RESULTSET kann erst zugegriffen werden, wenn AWAIT für das RESULTSET ausgeführt wird.
Verwendet einen Cursor, um die Summe der
order_amount-Zeilen für jede Tabelle zu berechnen.Addiert die Summen für die Tabellen und gibt den Wert zurück.
Note: If you use Snowflake CLI, SnowSQL, the Classic Console, or the
execute_stream or execute_string method in Python Connector
code, use this example instead (see Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):
Rufen Sie die gespeicherte Prozedur auf:
Beispiel: Ausführen von untergeordneten Jobs, die gleichzeitig Zeilen in Tabellen einfügen¶
Der folgende Code zeigt, wie Sie das Schlüsselwort ASYNC verwenden, um mehrere untergeordnete Jobs auszuführen, die gleichzeitig Zeilen in eine Tabelle einfügen. Das Beispiel gibt das Schlüsselwort ASYNC für Abfragen an, die für RESULTSETs ausgeführt werden.
Die folgende gespeicherte Prozedur führt die folgenden Aktionen aus:
Erstellt die Tabelle
orders_q3_2024, wenn sie nicht existiert.Erzeugt zwei RESULTSETs,
insert_1undinsert_2, die die Ergebnisse von Einfügungen in die Tabelle enthalten. Die Argumente der gespeicherten Prozedur geben die Werte an, die in die Tabelle eingefügt werden.Legt fest, dass die Einfügungen als gleichzeitige untergeordnete Jobs ausgeführt werden, indem Sie das Schlüsselwort ASYNC verwenden.
Führt die AWAIT-Anweisung für jedes RESULTSET aus, sodass die Prozedur wartet, bis die Einfügungen beendet sind, bevor sie fortfährt. Auf die Ergebnisse eines RESULTSET kann erst zugegriffen werden, wenn AWAIT für das RESULTSET ausgeführt wird.
Erzeugt eine neues RESULTSET
res, das die Ergebnisse einer Abfrage in der Tabelleorders_q3_2024enthält.Gibt die Ergebnisse der Abfrage zurück.
Note: If you use Snowflake CLI, SnowSQL, the Classic Console, or the
execute_stream or execute_string method in Python Connector
code, use this example instead (see Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):
Rufen Sie die gespeicherte Prozedur auf:
Beispiel: Ausführen von untergeordneten Aufträgen in gespeicherten Prozeduren mit AWAIT ALL-Anweisungen¶
In den folgenden Beispielen wird das Schlüsselwort ASYNC verwendet, um mehrere untergeordnete Aufträge gleichzeitig in gespeicherten Prozeduren auszuführen. Die Beispiele geben das Schlüsselwort ASYNC für Anweisungen an, die nicht mit einem RESULTSET verbunden sind, und verwenden dann die Anweisung AWAIT ALL, damit der gespeicherte Prozedurcode auf den Abschluss aller asynchronen untergeordneten Aufträge wartet.
Erstellen Sie eine gespeicherte Prozedur, die Werte gleichzeitig einfügt
Erstellen Sie eine gespeicherte Prozedur, die Werte gleichzeitig aktualisiert
Erstellen Sie eine gespeicherte Prozedur, die gleichzeitig andere gespeicherte Prozeduren aufruft
Erstellen Sie eine gespeicherte Prozedur, die Werte gleichzeitig einfügt¶
Die folgende gespeicherte Prozedur verwendet das Schlüsselwort ASYNC, um mehrere untergeordnete Aufträge auszuführen, die gleichzeitig Zeilen in eine Tabelle einfügen. Das Beispiel gibt das Schlüsselwort ASYNC für die Anweisungen INSERT an. Das Beispiel verwendet auch die Anweisung AWAIT ALL, damit die gespeicherte Prozedur auf den Abschluss aller asynchronen untergeordneten Aufträge wartet.
Note: If you use Snowflake CLI, SnowSQL, the Classic Console, or the
execute_stream or execute_string method in Python Connector
code, use this example instead (see Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):
Erstellen Sie eine gespeicherte Prozedur, die Werte gleichzeitig aktualisiert¶
Die folgende gespeicherte Prozedur verwendet das Schlüsselwort ASYNC, um mehrere untergeordnete Aufträge auszuführen, die gleichzeitig Zeilen in einer Tabelle aktualisieren. Das Beispiel gibt das Schlüsselwort ASYNC für die Anweisungen UPDATE an. Das Beispiel verwendet auch die Anweisung AWAIT ALL, damit die gespeicherte Prozedur auf den Abschluss aller asynchronen untergeordneten Aufträge wartet.
Erstellen Sie eine Tabelle, und fügen Sie Daten ein:
Erstellen Sie die gespeicherte Prozedur:
Note: If you use Snowflake CLI, SnowSQL, the Classic Console, or the
execute_stream or execute_string method in Python Connector
code, use this example instead (see Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):
Erstellen Sie eine gespeicherte Prozedur, die gleichzeitig andere gespeicherte Prozeduren aufruft¶
Note: If you use Snowflake CLI, SnowSQL, the Classic Console, or the
execute_stream or execute_string method in Python Connector
code, use this example instead (see Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):
Rufen Sie die gespeicherte Prozedur test_async_child_job_calls auf:
Fragen Sie die Tabellen ab, um die Ergebnisse zu sehen:
Beispiel: Untergeordnete Aufträge für Einfügungen in einer Schleife ausführen¶
Der folgende Code zeigt, wie Sie das Schlüsselwort ASYNC in einer Schleife verwenden, um mehrere untergeordnete Aufträge auszuführen, die gleichzeitig Zeilen in eine Tabelle einfügen.
Dieses Beispiel verwendet die Daten in den folgenden Tabellen:
Erstellen Sie eine gespeicherte Prozedur, die Werte aus async_loop_test1, verkettet mit dem Text async_ in async_loop_test2 unter Verwendung asynchroner untergeordneter Jobs in eine FOR Schleife einfügt. Die Schleife erstellt bei jeder Iteration einen separaten asynchronen untergeordneten Auftrag. Die Anweisung AWAIT ALL blockiert den Fortschritt in der gespeicherten Prozedur, bis alle untergeordneten Aufträge erledigt sind.
Note: If you use Snowflake CLI, SnowSQL, the Classic Console, or the
execute_stream or execute_string method in Python Connector
code, use this example instead (see Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):
Rufen Sie die gespeicherte Prozedur auf:
Fragen Sie die Tabelle async_loop_test2 ab, um die Ergebnisse zu sehen: