Условный оператор WHERE в SQL использует поиск индекса вместо поиска индекса - PullRequest
0 голосов
/ 23 ноября 2010

Рассмотрим следующий код:

DECLARE @TaskId int;
SET @TaskId = 594725;

SELECT Report.Amount FROM Report WHERE Report.TaskId = @TaskId;

SELECT Report.Amount FROM Report WHERE (@TaskId = -1 OR Report.TaskId = @TaskId);

У меня есть некластеризованный индекс в таблице Report с индексированным столбцом TaskId .Первый SELECT использует индекс с INDEX SEEK , но второй возвращается к INDEX SCAN из-за условной проверки переменной @TaskId.Есть ли способ выполнить условную проверку (если, например, @ TaskId является фильтром и -1 должен вернуть все строки), и при этом получить запрос для использования INDEXSEEK

1 Ответ

3 голосов
/ 23 ноября 2010

Попробуйте:

IF (@TaskId = -1)
    SELECT Report.Amount FROM Report
ELSE
    SELECT Report.Amount FROM Report WHERE Report.TaskId = @TaskId

Когда @TaskId = -1, конечно, он не будет выполнять поиск по индексу, поскольку будет просто читать все данные.

Обновление:
Прочтите эту прекрасную статью по этому вопросу - динамический поиск является распространенным сценарием.
Вам следует знать о кэшировании плана выполнения, поскольку при переключении с одного набора «необязательных» параметров на другой вы можете столкнуться с плохой производительностью, поэтому вы можете в конечном итоге использовать плохой план выполнения, что приведет к снижению производительности. В этом случае вы хотели бы рассмотреть возможность использования подсказки OPTION (RECOMPILE), чтобы он каждый раз генерировал новый план, который был бы наилучшим планом для этого конкретного набора параметров. Проверьте статью полностью, хотя.

...