Будет ли приведенная ниже хранимая процедура перекомпилироваться при каждом запуске из-за наличия в ней динамического 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 уже достаточно замедляется. Эта часть процедуры анализируется и выполняется при каждом запуске.