Travailler avec des tâches enfants asynchrones¶
Cette rubrique explique comment utiliser les tâches enfants asynchrones dans Snowflake Scripting.
Introduction aux tâches enfants asynchrones¶
Dans Snowflake Scripting, une tâche enfant asynchrone est une requête qui s’exécute en arrière-plan pendant que le code d’un bloc continue à s’exécuter. La requête peut être n’importe quelle instruction SQL valide, y compris des instructions SELECT et DML telles que INSERT ou UPDATE.
Pour exécuter une requête en tant que tâche enfant asynchrone, placez le mot-clé ASYNC avant la requête. Lorsque ce mot-clé est omis, le bloc Snowflake Scripting exécute les tâches enfants de manière séquentielle, et chaque tâche enfant attend que la tâche enfant en cours se termine avant de commencer. Les tâches enfants asynchrones peuvent être exécutées simultanément, ce qui permet d’améliorer l’efficacité et de réduire la durée d’exécution globale.
Vous pouvez utiliser le mot-clé ASYNC de la manière suivante :
Pour une requête exécutée sur RESULTSET.
Pour une requête exécutée indépendamment d’un RESULTSET.
Pour gérer les tâches enfants asynchrones, utilisez les instructions AWAIT et CANCEL :
L’instruction AWAIT attend la fin de toutes les tâches enfants asynchrones en cours d’exécution ou la fin d’une tâche enfant spécifique en cours d’exécution pour un RESULTSET, puis revient lorsque toute les tâches sont terminées ou que la tâche spécifique est terminée, respectivement.
L’instruction CANCEL annule une tâche enfant asynchrone en cours d’exécution pour un RESULTSET.
Vous pouvez vérifier le statut d’une tâche enfant asynchrone en cours d’exécution pour un RESULTSET en appelant la fonction SYSTEM$GET_RESULTSET_STATUS.
Actuellement, jusqu’à 4 000 tâches enfants asynchrones peuvent être exécutées simultanément. Une erreur est renvoyée si le nombre de tâches enfants asynchrones simultanées dépasse cette limite.
Note
Lorsque plusieurs tâches enfants asynchrones sont exécutées simultanément dans la même session, l’ordre d’achèvement des tâches n’est connu qu’à la fin de leur exécution. Comme l’ordre d’achèvement peut varier, l’utilisation de la fonction LAST_QUERY_ID avec des tâches enfants asynchrones n’est pas déterministe.
Exemples d’utilisation de tâches enfants asynchrones¶
Les sections suivantes présentent des exemples d’utilisation de tâches enfants asynchrones :
Exemple : exécution de tâches enfants qui effectuent des requêtes simultanées sur les tables
Exemple : exécution simultanée de tâches enfant qui insèrent des lignes dans les tables
Exemple : Exécution de tâches enfants dans des procédures stockées avec des instructions AWAIT ALL
Exemple : Exécution de tâches enfants pour les insertions dans une boucle
Exemple : exécution de tâches enfants qui effectuent des requêtes simultanées sur les tables¶
Le code suivant montre comment utiliser le mot-clé ASYNC pour exécuter plusieurs tâches enfants qui interrogent des tables de requête simultanément. L’exemple spécifie le mot-clé ASYNC pour les requêtes qui sont exécutées pour RESULTSETs.
Cet exemple utilise les données des tables suivantes :
La procédure stockée suivante effectue les actions suivantes :
Effectue une requête dans les deux tables pour obtenir les valeurs
order_amountdans toutes les lignes et renvoie les résultats à différents RESULTSETs (un pour chaque table).Spécifie que les requêtes s’exécutent en tant que tâches enfant simultanées en utilisant le mot-clé ASYNC.
Exécute l’instruction AWAIT pour chaque RESULTSET afin que la procédure attende la fin des requêtes avant de poursuivre. Les résultats de la requête pour un RESULTSET ne sont pas accessibles tant que AWAIT n’est pas exécuté pour le RESULTSET.
Utilise un curseur pour calculer la somme des lignes
order_amountpour chaque table.Additionne les totaux des tables et renvoie la valeur.
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):
Appelez la procédure stockée :
Exemple : exécution simultanée de tâches enfant qui insèrent des lignes dans les tables¶
Le code suivant montre comment utiliser le mot-clé ASYNC pour exécuter simultanément plusieurs tâches enfants qui insèrent des lignes dans une table. L’exemple spécifie le mot-clé ASYNC pour les requêtes qui sont exécutées pour RESULTSETs.
La procédure stockée suivante effectue les actions suivantes :
Crée la table
orders_q3_2024si elle n’existe pas.Crée deux RESULTSETs,
insert_1etinsert_2, qui contiennent les résultats des insertions dans la table. Les arguments de la procédure stockée spécifient les valeurs qui sont insérées dans la table.Spécifie que les insertions s’exécutent en tant que tâches enfant simultanées en utilisant le mot-clé ASYNC.
Exécute l’instruction AWAIT pour chaque RESULTSET afin que la procédure attende la fin des insertions avant de poursuivre. Les résultats d’un RESULTSET ne sont pas accessibles tant que AWAIT n’a pas été exécuté pour le RESULTSET.
Crée un nouveau site RESULTSET
resqui contient les résultats d’une requête sur la tableorders_q3_2024.Renvoie les résultats de la requête.
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):
Appelez la procédure stockée :
Exemple : Exécution de tâches enfants dans des procédures stockées avec des instructions AWAIT ALL¶
Les exemples suivants utilisent le mot-clé ASYNC pour exécuter simultanément plusieurs tâches enfants dans des procédures stockées. Les exemples spécifient le mot-clé ASYNC pour les instructions qui ne sont pas associées à un RESULTSET, puis utilisent l’instruction AWAIT ALL pour que le code de la procédure stockée attende la fin de toutes les tâches enfants asynchrones.
Créer une procédure stockée qui insère des valeurs simultanément
Créer une procédure stockée qui met à jour des valeurs de manière simultanée
Créer une procédure stockée qui appelle d’autres procédures stockées simultanément
Créer une procédure stockée qui insère des valeurs simultanément¶
La procédure stockée suivante utilise le mot-clé ASYNC pour exécuter simultanément plusieurs tâches enfants qui insèrent des lignes dans une table. L’exemple spécifie le mot-clé ASYNC pour les instructions INSERT. L’exemple utilise également l’instruction AWAIT ALL pour que la procédure stockée attende la fin de toutes les tâches enfants asynchrones.
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):
Créer une procédure stockée qui met à jour des valeurs de manière simultanée¶
La procédure stockée suivante utilise le mot-clé ASYNC pour exécuter plusieurs tâches enfants qui mettent à jour simultanément les lignes d’une table. L’exemple spécifie le mot-clé ASYNC pour les instructions UPDATE. L’exemple utilise également l’instruction AWAIT ALL pour que la procédure stockée attende la fin de toutes les tâches enfants asynchrones.
Créer une table et insérer des données :
Créez la procédure stockée :
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):
Créer une procédure stockée qui appelle d’autres procédures stockées simultanément¶
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):
Appelez la procédure stockée test_async_child_job_calls :
Interrogez les tables pour voir les résultats :
Exemple : Exécution de tâches enfants pour les insertions dans une boucle¶
Le code suivant montre comment utiliser le mot-clé ASYNC dans une boucle pour exécuter simultanément plusieurs tâches enfants qui insèrent des lignes dans une table.
Cet exemple utilise les données des tables suivantes :
Créez une procédure stockée qui insère les valeurs de async_loop_test1, concaténées avec le texte async_ dans async_loop_test2 en utilisant des tâches enfants asynchrones dans une boucle FOR. La boucle crée une tâche enfant asynchrone distincte à chaque itération. L’instruction AWAIT ALL bloque la progression de la procédure stockée jusqu’à ce que toutes les tâches enfants soient terminées.
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):
Appelez la procédure stockée :
Interrogez la table async_loop_test2 pour voir les résultats :