Parameter sniffing — это поведение SQL Server, при котором оптимизатор запросов анализирует (sniffs) значения параметров, переданные при первом выполнении хранимой процедуры или параметризованного запроса. После этого он компилирует и кэширует план выполнения, оптимизированный специально для этих начальных значений.
Кэшированный план переиспользуется для всех последующих выполнений, независимо от переданных значений параметров. Это становится проблемой, когда:
Это приводит к непредсказуемой и сложной в диагностике деградации производительности.
-- Первый вызов кэширует план, оптимизированный для CustomerID = 1 (1 строка)
EXEC GetOrders @CustomerID = 1
-- Это переиспользует тот же план, но CustomerID = 999 возвращает 1 миллион строк
EXEC GetOrders @CustomerID = 999
OPTION(RECOMPILE) — принудительно создаёт новый план при каждом выполнении; идеально подходит для параметров с высокой вариативностьюOPTIMIZE FOR — указывает оптимизатору компилировать план под конкретное или среднее значениеOPTIMIZE FOR UNKNOWN — говорит оптимизатору игнорировать анализируемые значения и опираться на статистические средниеParameter sniffing не всегда вреден — он улучшает производительность при стабильных, равномерных нагрузках. Проблемы возникают только тогда, когда разные значения параметров порождают существенно различающиеся планы выполнения — и тут уже нужно выбирать решение под конкретный случай.
Parameter sniffing в SQL Server происходит, когда оптимизатор запросов инспектирует значения параметров во время первого выполнения и переиспользует кэшированный план для всех последующих выполнений независимо от новых значений параметров.
Новый — ещё не проверен сообществом
Вы