Несколько ответов на вопрос OP верны, потому что они возвращают ожидаемые результаты, но большинство из них неэффективны, потому что они препятствуют правильному использованию индекса.
Заключение имен столбцов в выражения, такие как выражения падежа или функции, предотвращает SQLСервер использует индексы.
Предикаты с оператором OR и условия параметров также препятствуют эффективному плану выполнения.
Существует несколько способов эффективного построения запроса:
Добавить вычисляемый столбец
Добавить вычисляемый столбец, например:
ALTER TABLE ADD HotList AS ISNULL (ro_HotList, 'No')
И индексЭто.Тогда запрос будет проще и удобнее индексировать:
WHERE HotList = @ HotList
Приложение Smart Client
Клиентское приложение может быть достаточно умным, чтобывыполните следующее (псевдокод)
If HostListParameter is "No" then execute the query:
SELECT <column list>
FROM Whatever
WHERE ro_HostList = 'No' OR ro_HostList IS NULL
Else execute this other query:
SELECT <column list>
FROM Whatever
WHERE ro_HostList = @HotList
Invalid parameter
Использование пакета T-SQL с логикой
Вместо выполнения одного оператора выбора, выполните пакет с логикой
IF @HostList = 'No'
BEGIN
SELECT <column list>
FROM Whatever
WHERE ro_HostList = 'No' OR ro_HostList IS NULL
END
ELSE
BEGIN
SELECT <column list>
FROM Whatever
WHERE ro_HostList = @HotList
END
Использование хранимой процедуры
Вы можете создать хранимую процедуру, которая выполняет ту же логику, что и предыдущий пакет T-SQL
ИспользованиеOPTION(RECOMPILE)
Добавление OPTION (RECOMPILE)
Добавление OPTION (RECOMPILE) к ответу Impaler приводит к улучшению планов выполнения, которые могут использовать индексы, однако это также предотвращает повторное использование плана.
Но редко используемые индексы с низкой селективностью используются
Если столбец содержит несколько значений, индекс без покрытия в большинстве случаев бесполезен.
В этом случае Iдумаю, что столбец может содержать только «Да», «Нет» или NULL.Так что индексирование не улучшит производительность.И лучший ответ - ответ KeithL.