Как оптимизировать использование предложения «ИЛИ» при использовании с параметрами (SQL Server 2008)

Интересно, есть ли какой-нибудь разумный способ переписать следующий запрос, чтобы оптимизаторы использовали индексы столбцов?

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

Теперь мой вопрос: что нам делать, если возможные комбинации больше трех или четырех? Написание отдельного запроса для каждой комбинации не представляется рациональным решением. Есть ли другой способ обойти эту проблему?

Ответы на вопрос(4)

Ваш ответ на вопрос