Один из способов справиться с проверкой на недействительность в выражении предложения where
заключается в следующем:
declare @myParameter int
select *
from dbo.foo t
where t.someColumn = coalesce( @myParameter , t.someColumn )
Оптимизатор все еще может использовать индекс для t.someColumn
, и вы избегаетеOR
оператор (это то, что обычно сбивает с толку использование индекса.
Это одна вещь, на которую нужно смотреть.
Другая вещь: я должен был сделать то же самое в предыдущей работеПроблема с наивным кодированием состоит в том, что вы, вероятно, получите низкую производительность по одной из следующих причин:
Если 1-й выполненный запрос выполняется с тем, что вы могли быЕсли описать как «нестандартные» параметры, то кэшированный план выполнения, вероятно, будет работать плохо для более обычных случаев.
Со всеми этими переменными оптимизатор может выбрать план запроса, набранный вдля параметра, который может даже не использоваться большую часть времени.
список можно продолжить ...
Что я в итоге делал, должен был инструмент хранимой процедурылог, как это называлось.После того, как у меня были некоторые исходные данные, небольшой анализ показал мне 4 или 5 наиболее распространенных способов их использования.
Это позволило мне добавить дополнительные сценарии для каждого из этих наиболее распространенных способов, так что 90%вызывающие абоненты получили отличную производительность, большинство остальных получили нормальную производительность, и был когда-то особый случай, с которым мы ничего не могли поделать (если только администраторы не захотели перекластировать некоторые из таблиц, участвующих в выборе ... что казалось маловероятным).
Кроме того, вы должны назначить параметры хранимой процедуры локальным переменным внутри хранимой процедуры.Если вы этого не сделаете, переданные параметры влияют на кэширование плана выполнения.При этом значение параметра становится выражением и больше не влияет на кэш планов выполнения.
Кроме того, помните о перекомпиляции хранимых процедур.В загруженной системе перекомпиляция может отрицательно повлиять на производительность.Если хранимая процедура перекомпилируется один или несколько раз при каждом вызове хранимой процедуры, перекомпиляция снимает блокировки компиляции, которые (A) не позволяют другим выполнять хранимую процедуру до завершения перекомпиляции, и (B) блокируют различные задействованные ресурсы / зависимостив перекомпиляции.В загруженной системе ваш администратор базы данных вряд ли будет с пользой смотреть на блокировку.
Вот MSDN на Кэширование и повторное использование плана выполнения
Надеюсь, это поможет.