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

Откуда:
Сообщений: 38
Подскажите пожалуйста, возможно ли использование индексов в следующем запросе.
select *
from a
inner join p on a.Id = (
          case when p.Field1 = 0
               then p.Field2
               else p.Field1
          end)

Сделал два не уникальных индекса - на p.Field1 и на p.Field2. В таблице p 15000 записей. План запроса показывает, что ни один из индексов не используется. Происходит скан таблицы p.

При этом если сделать запрос:
select * from a inner join p on a.Id = p.Field1

или
select * from a inner join p on a.Id = p.Field2

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

Что-то не получается у меня найти в инете, возможно ли вообще использование индексов при соединении таблиц через case.
15 июл 15, 18:05    [17896436]     Ответить | Цитировать Сообщить модератору
 Re: Использование индексов при соединении через case  [new]
invm
Member

Откуда: Москва
Сообщений: 9397
xtony
возможно ли вообще использование индексов при соединении таблиц через case.
Нет.

Заведите в p вычисляемый столбец
alter table p add FieldN as case when Field1 = 0 then Field2 else Field1 end
И по нему уже стройте индекс и соединяйте таблицы.
Правда далеко не факт, что этот индекс будет использован при соединении таблиц.
15 июл 15, 18:13    [17896456]     Ответить | Цитировать Сообщить модератору
 Re: Использование индексов при соединении через case  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
не поможет развертывание case?
select * 
from a
join p on p.f1=a.id or p.f1=0 and p.f2=a.id
15 июл 15, 19:03    [17896615]     Ответить | Цитировать Сообщить модератору
 Re: Использование индексов при соединении через case  [new]
xtony
Member

Откуда:
Сообщений: 38
Попробовал развернуть, но индексы все равно не хотят использоваться.
Наверное, пока оставлю как есть, пока не очень сильно подтормаживает. Добавлять вычисляемые поля не могу - БД чужая. Но если начнутся проблемы со скоростью, буду разработчиков просить.

Спасибо за советы!
15 июл 15, 19:28    [17896678]     Ответить | Цитировать Сообщить модератору
 Re: Использование индексов при соединении через case  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
xtony,

Надо до конца разворачивать. OR ,в данном случае, разворачивается в UNION ALL:

select * 
from a
join p on p.f1<>0 and p.f1=a.id

UNION ALL

select * 
from a
join p on p.f1=0 and p.f2=a.id
15 июл 15, 21:51    [17897198]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить