У меня есть параметризованная хранимая процедура. Одним из параметров является @aName
, которому разрешено быть NULL
и часто имеет значение NULL.Ускорение неэффективного фильтра
Запрос в хранимой процедуре содержит следующий фильтр:
AND Name LIKE ('%' + ISNULL(@aName,Name) + '%')
Этот фильтр работает, но меня поражает, как неэффективная по следующей причине:
Если @aName
равна нулю, то мы просто хотим Name = Name
но мы получают Name LIKE ('%Name%')
.
Как я закорачивать фильтр так, что я получаю следующее:
- Если @aName равно нулю, то используйте
Name = Name
или1=1
. - Если @aName не равно null, используйте
Name LIKE ('%Name%')
.
Вы можете добавить 'OPTION (RECOMPILE)', чтобы заставить его принять во внимание фактическое значение переменной, хотя вам, вероятно, все равно придется писать его как 'AND (@aName IS NULL ИЛИ Name LIKE ('%' + @ aName + '%')) ' –
@MartinSmith добавлен. Нужно ли мне скрывать старые сохраненные планы или нужно добавить подсказку? – whytheq