T-SQL-lussen gebruiken voor toegewezen SQL-pools in Azure Synapse Analytics

In dit artikel zijn tips opgenomen voor het ontwikkelen van toegewezen SQL-pooloplossingen met behulp van T-SQL-lussen en het vervangen van cursors.

Doel van WHILE-lussen

Toegewezen SQL-pools in Azure Synapse de WHILE-lus ondersteunen voor het herhaaldelijk uitvoeren van instructieblokken. Deze WHILE-lus gaat door zolang de opgegeven voorwaarden waar zijn of totdat de code de lus specifiek beëindigt met behulp van het trefwoord BREAK.

Lussen zijn handig voor het vervangen van cursors die zijn gedefinieerd in SQL-code. Gelukkig zijn bijna alle cursors die in SQL-code zijn geschreven van de snelle, alleen-lezen variant. WHILE-lussen zijn dus een goed alternatief voor het vervangen van cursors.

Cursors vervangen in toegewezen SQL-pool

Voordat u echter eerst in het hoofd duikt, moet u uzelf de volgende vraag stellen: "Kan deze cursor worden herschreven om bewerkingen op basis van een set te gebruiken?"

In veel gevallen is het antwoord ja en vaak de beste aanpak. Een bewerking op basis van een set werkt vaak sneller dan een iteratieve, rij-voor-rij-benadering.

Snel vooruit lezen cursors kunnen eenvoudig worden vervangen door een lusconstructie. Het volgende voorbeeld is eenvoudig. In dit codevoorbeeld worden de statistieken voor elke tabel in de database bijgewerkt. Door de tabellen in de lus te herhalen, wordt elke opdracht achter elkaar uitgevoerd.

Maak eerst een tijdelijke tabel met een uniek rijnummer dat wordt gebruikt om de afzonderlijke instructies te identificeren:

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
;

Ten tweede initialiseert u de variabelen die nodig zijn om de lus uit te voeren:

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

Loop-over-instructies die ze nu één voor één uitvoeren:

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

Verwijder ten slotte de tijdelijke tabel die u in de eerste stap hebt gemaakt

DROP TABLE #tbl;

Volgende stappen

Zie Overzicht van ontwikkeling voor meer tips voor ontwikkeling.