Интересно, есть ли какой-нибудь разумный способ переписать следующий запрос так, чтобы индексы по столбцам использовались оптимизатором?
Create Procedure select_Proc1
@Key1 int=0,
@Key2 int=0
As
BEGIN
Select key3
From Or_Table
Where (@key1 =0 OR Key1 =@Key1) AND
(@key2 =0 OR Key2 =@Key2)
END
GO
Несмотря на то, что столбцы в предложениях WHERE покрыты индексами, SQL Server не может использовать эти индексы. Это поднимает вопрос о том, блокирует ли что-либо использование индексов. Ответ на этот вопрос - да - виновниками являются параметры и условие «ИЛИ». Параметры не охватываются индексами, что означает, что SQL Server не может использовать ни один из индексов для оценки «@ key1 = 0» (условие, которое также применяется к @ key2 = 0). Фактически это означает, что SQL Server не может использовать индексы для оценки предложения «@ key1 = 0 ИЛИ Key1 = @ ключ1» (поскольку предложение «ИЛИ» представляет собой объединение строк, охватываемых обоими условиями). Тот же принцип применим и к другому пункту (re. Key2). Это приводит к тому, что SQL Server приходит к выводу, что никакие индексы не могут использоваться для извлечения строк, а SQL Server использует следующий лучший подход - сканирование кластерных индексов
Как видите, оптимизатор SQL не будет использовать индексы для столбцов, если предикаты имеют значение "ИЛИ" в предложении WHERE. Одним из решений этой проблемы является разделение запросов с помощью предложения IF для всех возможных комбинаций параметров.
Пожалуйста, прочтите эту короткую статью, чтобы получить более полное представление о проблеме: http://www.sql -server-performance.com / articles / per / optimize_or_clause_p1.aspx
Теперь мой вопрос: что нам делать, если возможные комбинации больше, чем три или четыре? Написание отдельного запроса для каждой комбинации не представляется рациональным решением. Есть ли другой способ решения этой проблемы?