Должны ли вы всегда предвидеть проблемы, вызванные анализом параметров?
Используя SQL Server 2008, у меня есть простая хранимая процедура, содержимое которой
DELETE FROM [ABC].[dbo].[LookUpPermissions]
WHERE Code = @Code
В недавнем обзоре кода администратор базы данных сказал, что я должен "добавить анализ параметров", что, как я считаю, означает, что я должен учитывать анализ параметров. Я никогда не делал этого в прошлом, и у меня нет проблем с производительностью запроса, поэтому я думаю, что это не нужно.
Хотя я предполагаю, что ответом может быть пользовательское предпочтение, лучше ли учитывать учет параметров? Это необходимо, если хранимая процедура вызывается для небольшого набора данных, используется редко и не имеет проблем с производительностью?
редактировать
Это применимо только к параметрам, используемым в предложении WHERE, или, например, вам нужно будет учитывать все параметры в операторе INSERT?
2 ответа
Простой поиск одного значения, подобного этому, не должен быть уязвим для перехвата параметров. Это больше беспокоит, когда переданные параметры приводят к совершенно разным результатам, и оптимальный план выполнения отличается от того, который был создан ранее.
В качестве примера рассмотрим запрос, который ищет строки, в которых столбец даты находится между @start_date и @end_date. Вызов процедуры с диапазоном дат 2 дня может создать / кэшировать план выполнения, который не оптимален для диапазона дат 1 год.
Параметр Sniffing - это еще одна встроенная "умная штуковина" (не забывайте о проверке встроенных заклинаний / грамматик), которую Microsoft использует для оптимизации запросов SQL. Анализируя входные параметры, SQL Server делает наиболее обоснованное предположение о том, какой план кэшированных запросов будет наилучшим для использования. Это не всегда делает правильный выбор.