Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Не используется индекс  [new]
Kudep
Member

Откуда: From Russia
Сообщений: 146
Есть поле SomeData типа int, по нему потроен некластерный индекс.
Если запрос с условием:
where SomeData > @SomeDataFrom and SomeData < @SomeDataTo

индекс используется.

А если
where (@SomeDataFrom is null or SomeData > @SomeDataFrom) and (@SomeDataTo is null or SomeData < @SomeDataTo)

то разумеется не используется.
Вопрос, можно ли это как-то обыграть? Т.е. мне нужно проверить входные параметры на null и при этом, чтобы индекс использовался.
11 сен 12, 16:26    [13147257]     Ответить | Цитировать Сообщить модератору
 Re: Не используется индекс  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
а) or переписать на union all
б) option ( recompile )
11 сен 12, 16:27    [13147270]     Ответить | Цитировать Сообщить модератору
 Re: Не используется индекс  [new]
between?
Guest
Kudep,
where SomeData>isnull(@SomeDataFrom,SomeData-1) 
  and  SomeData<isnull(@SomeDataTo,SomeData+1) 

не? нечем проверить...
11 сен 12, 16:30    [13147292]     Ответить | Цитировать Сообщить модератору
 Re: Не используется индекс  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Гавриленко Сергей Алексеевич
а) or переписать на union all
where @SomeDataFrom is null and @SomeDataTo is null
union
where @SomeDataFrom is null and SomeData < @SomeDataTo
union
where SomeData > @SomeDataFrom and @SomeDataTo is null
union
where SomeData > @SomeDataFrom and SomeData < @SomeDataTo
11 сен 12, 16:40    [13147385]     Ответить | Цитировать Сообщить модератору
 Re: Не используется индекс  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
iap
Гавриленко Сергей Алексеевич
а) or переписать на union all
where @SomeDataFrom is null and @SomeDataTo is null
union
where @SomeDataFrom is null and SomeData < @SomeDataTo
union
where SomeData > @SomeDataFrom and @SomeDataTo is null
union
where SomeData > @SomeDataFrom and SomeData < @SomeDataTo
Или UNION ALL?
11 сен 12, 16:42    [13147403]     Ответить | Цитировать Сообщить модератору
 Re: Не используется индекс  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Можно конечно так извратится:
WHERE @SomeDataFrom IS NOT NULL AND @SomeDataTo IS NOT NULL AND SomeData >= @SomeDataFrom	AND SomeData < @SomeDataTo
UNION ALL
WHERE @SomeDataFrom IS NOT NULL AND @SomeDataTo IS     NULL AND SomeData >= @SomeDataFrom
UNION ALL
WHERE @SomeDataFrom IS     NULL AND @SomeDataTo IS NOT NULL					AND SomeData < @SomeDataTo
UNION ALL
WHERE @SomeDataFrom IS     NULL AND @SomeDataTo IS     NULL
Тогда в плане видны красивых четыре Startup Predicate

Опять проблемы с NULL.
Если считать что NULL есть и начало и конец диапазона, то в принципе это один и тот же SEEK
А M$ не хочет на это смотреть.

Может ещё один запрос зарегистрировать к ним?
11 сен 12, 16:58    [13147527]     Ответить | Цитировать Сообщить модератору
 Re: Не используется индекс  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Mnior,

что-то я не понял. Если SomeData >= @SomeDataFrom, то @SomeDataFrom IS NOT NULL автоматически?
11 сен 12, 17:04    [13147550]     Ответить | Цитировать Сообщить модератору
 Re: Не используется индекс  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
iap, да, но тогда не возникает красивого StartUp Peredicate в планет.
Прискорбное другое - не срабатывает нормальный анализ - при том что данные условия однозначны, он считает что придёт в 4 раза больше строк. А это не хорошо.

Компилятор тупой как пробка.
11 сен 12, 17:11    [13147603]     Ответить | Цитировать Сообщить модератору
 Re: Не используется индекс  [new]
Kudep
Member

Откуда: From Russia
Сообщений: 146
Дублировать большой запрос морально не готов.
Лучше пусть будет меджик намбер (SomeData > 0 и в нем максимум 8 цифр)
where SomeData>isnull(@SomeDataFrom,0) 
  and  SomeData<isnull(@SomeDataTo,9999999999)
11 сен 12, 18:06    [13147910]     Ответить | Цитировать Сообщить модератору
 Re: Не используется индекс  [new]
ййода
Guest
Kudep
Дублировать большой запрос морально не готов.


используй силу CTE, йунный падаван (с)
11 сен 12, 18:09    [13147924]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить