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

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

Чего следует ожидать

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

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

Введение в хранимые процедуры

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

Выделенный пул SQL поддерживает упрощенную и оптимизированную реализацию хранимых процедур. Главное отличие от SQL Server в том, что хранимая процедура не является предварительно скомпилированным кодом.

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

Совет

Цель — сэкономить часы, минуты и секунды, но не миллисекунды. Поэтому удобнее считать хранимые процедуры контейнерами для логики SQL.

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

Вложенные хранимые процедуры

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

Выделенный пул SQL поддерживает до восьми уровней вложенности. При этом уровень вложенности в SQL Server — 32.

Вызов хранимой процедуры верхнего уровня считается 1 уровнем вложенности.

EXEC prc_nesting

Если хранимая процедура также выполняет еще один вызов EXEC, уровень вложенности увеличится до 2.

CREATE PROCEDURE prc_nesting
AS
EXEC prc_nesting_2  -- This call is nest level 2
GO
EXEC prc_nesting

Если вторая процедура затем выполняет какой-либо динамический SQL-запрос, уровень вложенности увеличится до 3.

CREATE PROCEDURE prc_nesting_2
AS
EXEC sp_executesql 'SELECT 'another nest level'  -- This call is nest level 2
GO
EXEC prc_nesting

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

INSERT..EXECUTE

Выделенный пул SQL не позволяет использовать результирующий набор хранимой процедуры в инструкции INSERT. Однако существует другой подход, которым можно воспользоваться. Например, см. статью о временных таблицах.

Ограничения

В выделенном пуле SQL не реализованы некоторые аспекты хранимых процедур Transact-SQL:

  • временные хранимые процедуры;
  • нумерованные хранимые процедуры;
  • расширенные хранимые процедуры;
  • хранимые процедуры CLR;
  • возможность шифрования;
  • возможность репликации;
  • параметры с табличным значением;
  • параметры только для чтения;
  • параметры по умолчанию;
  • контекст выполнения;
  • Оператор return

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

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