Использование циклов T-SQL для выделенных пулов SQL в Azure Synapse Analytics

В эту статью включены советы по разработке решений для выделенного пула SQL с помощью циклов T-SQL и замены курсоров.

Назначение циклов WHILE

Выделенные пулы SQL в Azure Synapse поддерживают цикл WHILE для многократного выполнения блоков операторов. Цикл WHILE продолжается, пока не будут выполнены указанные условия или пока код не прервет цикл с помощью ключевого слова BREAK.

Циклы полезны для замены курсоров, определенных в коде SQL. К счастью, почти все курсоры, записанные в коде SQL, относятся к разряду перемотки и доступности только для чтения. Таким образом, циклы WHILE — отличная альтернатива для замены курсоров.

Замена курсоров в выделенном пуле SQL

Прежде чем обращаться к циклам, задайте себе следующий вопрос: "Можно ли переписать этот курсор, задействовав операции, ориентированные на работу с наборами данных?"

Во многих случаях ответ будет утвердительным, и это может оказаться лучшим вариантом. Операция, ориентированная на работу с набором данных, нередко выполняется быстрее, чем итеративный метод построчного перебора.

Курсоры быстрой перемотки, доступные только для чтения, легко заменяются циклической конструкцией. Следующий пример является простым. Приведенный в примере код обновляет статистику для каждой таблицы в базе данных. Перебор таблиц в цикле позволяет выполнить каждую команду в последовательности.

Для начала создайте временную таблицу с уникальным номером строки, обозначающим отдельные операторы:

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
;

Затем инициализируйте переменные, необходимые для выполнения цикла:

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

Теперь запустите цикл последовательного выполнения операторов:

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

И, наконец, удалите временную таблицу, созданной на первом этапе:

DROP TABLE #tbl;

Дальнейшие действия

Дополнительные советы по разработке приведены в обзоре разработки.