Utilisation de boucles T-SQL pour des pools SQL dédiés dans Azure Synapse Analytics

Cet article contient des conseils pour le développement de solutions de pool SQL dédié à l’aide de boucles T-SQL et le remplacement de curseurs.

Objectif des boucles WHILE

Les pools SQL dédiés dans Azure Synapse prennent en charge la boucle WHILE pour les blocs d’instructions dont l’exécution se répète. Cette boucle WHILE se poursuit aussi longtemps que les conditions spécifiées sont vraies, ou jusqu’à ce que le code arrête la boucle de manière spécifique, via le mot clé BREAK.

Les boucles s’avèrent utiles pour remplacer des curseurs définis dans le code SQL. Heureusement, presque tous les curseurs écrits en code SQL présentent le type à avance rapide, en lecture seule. Par conséquent, les boucles WHILE sont une alternative intéressante pour remplacer les curseurs.

Remplacement de curseurs dans un pool SQL dédié

Toutefois, avant de vous lancer, vous devez vous poser la question suivante : « Ce curseur peut-il être réécrit pour utiliser des opérations basées sur les jeux ? »

Dans de nombreux cas, la réponse est oui, et cette approche est souvent la meilleure. Une opération basée sur un jeu s’exécute généralement plus rapidement qu’une méthode itérative de type ligne par ligne.

Les curseurs à avance rapide et en lecture seule peuvent facilement être remplacés par des constructions en boucle. L’exemple suivant est simple. Cet exemple de code met à jour les statistiques de chaque table dans la base de données. En effectuant une itération sur les tables dans la boucle, chaque commande s’exécute en séquence.

Tout d’abord, créez une table temporaire contenant un numéro de ligne unique, utilisé pour identifier les instructions individuelles :

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
;

Deuxièmement, initialisez les variables nécessaires pour exécuter la boucle :

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

Ensuite, effectuez une boucle avec les instructions, en les exécutant l’une après l’autre :

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

Enfin, supprimez la table temporaire créée à la première étape.

DROP TABLE #tbl;

Étapes suivantes

Pour obtenir des conseils supplémentaires, consultez la vue d’ensemble du développement.