Compartilhar via


Usando loops T-SQL para pools de SQL dedicados no Azure Synapse Analytics

Estão incluídas neste artigo dicas para o desenvolvimento de soluções de pools SQL dedicados usando loops T-SQL e substituindo cursores.

Finalidade de loops WHILE

Os pools de SQL dedicados no Azure Synapse dão suporte ao loop WHILE para executar repetidamente blocos de instrução. Esse loop WHILE continua enquanto as condições especificadas forem verdadeiras ou até que o código encerre especificamente o loop usando a palavra-chave BREAK.

Loops são úteis para substituir cursores definidos no código SQL. Felizmente, quase todos os cursores que são escritos em código SQL são do tipo somente leitura de avanço rápido. Portanto, os loops WHILE são uma ótima alternativa para substituir cursores.

Substituindo cursores no pool de SQL dedicado

No entanto, antes de mergulhar na memória, primeiro você deve fazer a seguinte pergunta: “Esse cursor poderia ser reescrito para usar operações baseadas em conjunto?”

Em muitos casos, a resposta é sim e é frequentemente a melhor abordagem. Uma operação baseada em conjunto geralmente é executada mais rápido do que uma abordagem iterativa, linha por linha.

Os cursores somente leitura de avanço rápido podem ser facilmente substituídos por um constructo de looping. O exemplo a seguir é simples. Este exemplo de código atualiza as estatísticas de cada tabela no banco de dados. Ao percorrer as tabelas no loop, cada comando é executado em sequência.

Primeiro, crie uma tabela temporária que contém um número de linha exclusivo usado para identificar as instruções individuais:

CREATE TABLE #tbl
WITH
( DISTRIBUTION = ROUND_ROBIN
)
AS
SELECT  ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS Sequence
,       [name]
,       'UPDATE STATISTICS '+QUOTENAME([name]) AS sql_code
FROM    sys.tables
;

Em segundo lugar, inicialize as variáveis necessárias para executar o loop:

DECLARE @nbr_statements INT = (SELECT COUNT(*) FROM #tbl)
,       @i INT = 1
;

Agora, execute um loop sobre as instruções para executar uma por vez:

WHILE   @i <= @nbr_statements
BEGIN
    DECLARE @sql_code NVARCHAR(4000) = (SELECT sql_code FROM #tbl WHERE Sequence = @i);
    EXEC    sp_executesql @sql_code;
    SET     @i +=1;
END

Por fim, solte a tabela temporária criada na primeira etapa

DROP TABLE #tbl;

Próximas etapas

Para obter mais dicas de desenvolvimento, confira visão geral de desenvolvimento.