Использование циклов 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;
Дальнейшие действия
Дополнительные советы по разработке приведены в обзоре разработки.