Trabalhar com trabalhos secundários assíncronos¶
Este tópico explica como usar trabalhos secundários/filhos assíncronos no Snowflake Scripting.
Introdução aos trabalhos secundários assíncronos¶
No Snowflake Scripting, um trabalho secundário assíncrono é uma consulta que é executada em segundo plano enquanto o código em um bloco continua a ser executado. A consulta pode ser qualquer instrução SQL válida, incluindo instruções SELECT e instruções DML, como INSERT ou UPDATE.
Para executar uma consulta como um trabalho secundário assíncrono, coloque a palavra-chave ASYNC antes da consulta. Quando essa palavra-chave é omitida, o bloco Snowflake Scripting executa os trabalhos secundários sequencialmente, e cada trabalho secundário espera que o trabalho secundário em execução termine antes de começar. Os trabalhos secundários assíncronos podem ser executados simultaneamente, o que pode aumentar a eficiência e reduzir o tempo total de execução.
Você pode usar a palavra-chave ASYNC das seguintes maneiras:
Para uma consulta que é executada para RESULTSET.
Para uma consulta que é executada independentemente de um RESULTSET.
Para gerenciar trabalhos secundários assíncronos, use as instruções AWAIT e CANCEL:
A instrução AWAIT aguarda a conclusão de todos os trabalhos secundários assíncronos que estão em execução ou a conclusão de um trabalho secundário específico que está em execução para um RESULTSET e, em seguida, retorna quando todos os trabalhos tiverem sido concluídos ou o trabalho específico tiver sido concluído, respectivamente.
A instrução CANCEL cancela um trabalho secundário assíncrono que está sendo executado para um RESULTSET.
Você pode verificar o status de um trabalho secundário assíncrono que está sendo executado para um RESULTSET chamando a função SYSTEM$GET_RESULTSET_STATUS.
Atualmente, até 4.000 trabalhos secundários assíncronos podem ser executados simultaneamente. Um erro será retornado se o número de trabalhos secundários assíncronos simultâneos exceder esse limite.
Nota
Quando vários trabalhos secundários assíncronos são executados simultaneamente na mesma sessão, a ordem de conclusão do trabalho não é conhecida até que os trabalhos tenham terminado de ser executados. Como a ordem de conclusão pode variar, o uso da função LAST_QUERY_ID com trabalhos secundários assíncronos não é determinístico.
Exemplos de uso de trabalhos secundários assíncronos¶
As seções a seguir fornecem exemplos de uso de trabalhos secundários assíncronos:
Exemplo: como executar trabalhos filhos que consultam tabelas ao mesmo tempo
Exemplo: como executar trabalhos filhos que inserem linhas nas tabelas ao mesmo tempo
Exemplo: execução de trabalhos secundários em procedimentos armazenados com instruções AWAIT ALL
Exemplo: execução de trabalhos secundários para inserções em um loop
Exemplo: como executar trabalhos filhos que consultam tabelas ao mesmo tempo¶
O código a seguir mostra como usar a palavra-chave ASYNC para executar vários trabalhos filhos que consultam tabelas simultaneamente. O exemplo especifica a palavra-chave ASYNC para consultas que são executadas para RESULTSETs.
Este exemplo usa os dados das tabelas a seguir:
O procedimento armazenado a seguir executa as seguintes ações:
Consulta ambas as tabelas para os valores
order_amountem todas as linhas e retorna os resultados para diferentes RESULTSETs (um para cada tabela).Especifica que as consultas são executadas como trabalhos filhos simultâneos usando a palavra-chave ASYNC.
Executa a instrução AWAIT para cada RESULTSET para que o procedimento aguarde a conclusão das consultas antes de prosseguir. Os resultados de consulta para um RESULTSET não podem ser acessados até que o AWAIT seja executado para o RESULTSET.
Usa um cursor para calcular a soma das linhas
order_amountde cada tabela.Adiciona os totais das tabelas e retorna o valor.
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):
Chame o procedimento armazenado:
Exemplo: como executar trabalhos filhos que inserem linhas nas tabelas ao mesmo tempo¶
O código a seguir mostra como usar a palavra-chave ASYNC para executar vários trabalhos filhos que inserem linhas em uma tabela simultaneamente. O exemplo especifica a palavra-chave ASYNC para consultas que são executadas para RESULTSETs.
O procedimento armazenado a seguir executa as seguintes ações:
Cria a tabela
orders_q3_2024se ela não existir.Cria dois RESULTSETs,
insert_1einsert_2, que contêm os resultados das inserções na tabela. Os argumentos do procedimento armazenado especificam os valores que são inseridos na tabela.Especifica que as inserções são executadas como trabalhos filhos simultâneos usando a palavra-chave ASYNC.
Executa a instrução AWAIT para cada RESULTSET para que o procedimento aguarde a conclusão das inserções antes de prosseguir. Os resultados de um RESULTSET não podem ser acessados até que o AWAIT seja executado para o RESULTSET.
Cria um novo RESULTSET
resque contém os resultados de uma consulta na tabelaorders_q3_2024.Retorna os resultados da consulta.
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):
Chame o procedimento armazenado:
Exemplo: execução de trabalhos secundários em procedimentos armazenados com instruções AWAIT ALL¶
Os exemplos a seguir usam a palavra-chave ASYNC para executar vários trabalhos secundários simultaneamente em procedimentos armazenados. Os exemplos especificam a palavra-chave ASYNC para instruções que não estão associadas a um RESULTSET e, em seguida, usam a declaração AWAIT ALL para que o código do procedimento armazenado aguarde a conclusão de todos os trabalhos secundários assíncronos.
Criar um procedimento armazenado que insira valores simultaneamente
Criar um procedimento armazenado que atualize valores simultaneamente
Criar um procedimento armazenado que chame outros procedimentos armazenados simultaneamente
Criar um procedimento armazenado que insira valores simultaneamente¶
O procedimento armazenado a seguir usa a palavra-chave ASYNC para executar vários trabalhos secundários que inserem linhas em uma tabela simultaneamente. O exemplo especifica a palavra-chave ASYNC para as instruções INSERT. O exemplo também usa a instrução AWAIT ALL para que o procedimento armazenado aguarde a conclusão de todos os trabalhos secundários assíncronos.
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):
Criar um procedimento armazenado que atualize valores simultaneamente¶
O procedimento armazenado a seguir usa a palavra-chave ASYNC para executar vários trabalhos secundários que atualizam linhas em uma tabela simultaneamente. O exemplo especifica a palavra-chave ASYNC para as instruções UPDATE. O exemplo também usa a instrução AWAIT ALL para que o procedimento armazenado aguarde a conclusão de todos os trabalhos secundários assíncronos.
Criar uma tabela e inserir dados:
Crie o procedimento armazenado:
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):
Criar um procedimento armazenado que chame outros procedimentos armazenados simultaneamente¶
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):
Chame o procedimento armazenado test_async_child_job_calls:
Consulte as tabelas para ver os resultados:
Exemplo: execução de trabalhos secundários para inserções em um loop¶
O código a seguir mostra como usar a palavra-chave ASYNC em um loop para executar vários trabalhos secundários que inserem linhas em uma tabela simultaneamente.
Este exemplo usa os dados das tabelas a seguir:
Crie um procedimento armazenado que insira valores de async_loop_test1, concatenados com o texto async_ em async_loop_test2 usando trabalhos secundários assíncronos em um loop FOR. O loop cria um trabalho secundário assíncrono separado em cada iteração. A instrução AWAIT ALL bloqueia o progresso no procedimento armazenado até que todos os trabalhos secundários sejam concluídos.
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):
Chame o procedimento armazenado:
Consulte a tabela async_loop_test2 para ver os resultados: