Назад | Перейти на главную страницу

Динамический SQL в хранимой процедуре

Будет ли приведенная ниже хранимая процедура перекомпилироваться при каждом запуске из-за наличия в ней динамического SQL? Есть ли серьезные проблемы с производительностью этого метода?

CREATE PROCEDURE MyStoredProcedure
AS
BEGIN
 DECLARE @column varchar(3)
 SELECT @column = 'd' + CAST(DAY(GETDATE()) AS char)

 EXEC ('SELECT ' + @column + ' FROM t1')
END

Лучше по возможности избегать динамического SQL, правда. Для более подробного обсуждения см. этот SO поток. Однако, чтобы ответить на ваш вопрос: EXEC ('SELECT d21 FROM t1') оператор будет вести себя так же, как если бы запрос от клиента, содержащий скрипт SELECT d21 FROM t1 был получен сервером. Если план уже находится в кеше, он будет выполнен из кеша (с сохранением некоторых деталей, таких как изменения версии метаданных и т. Д.). Если нет, он будет скомпилирован, будет создан новый план и запущен. Обратите внимание, что такой запрос, как SELECT field FROM Table это то, что называетсяпростой запрос плана', стоимость создания плана для чего-то подобного для большинства систем совершенно незначительна.

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