Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье приведены советы по разработке выделенного решения пула 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;
Дальнейшие действия
Дополнительные советы по разработке приведены в обзоре разработки.