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

Откуда:
Сообщений: 241
Добрый день, подскажите, пожалуйста, есть ли в mssql что-то типа индекса по функции от поля?

Или иначе, как было бы правильнее решить такую задачу:

Есть таблица A с полем b типа varchar. Нужно ускорить выборку из A по критерию b like 'prefix%', где prefix может принимать несколько разных и заранее известных значений, по факту - содержащих еще один префикс. Например:
'постоянный префикс-фиговина',
'постоянный префикс-фиговина2',
'постоянный префикс-фиговина2-фиговина3'
....

Количество записей каждого типа составляет достаточно малую часть от общего количества записей в таблице, так что если б движок позволял сделать несколько индексов по left(A.b,L), где L - длина конкретного значения prefix, то, вероятно, это и было бы решением задачи. Но возможно ли это в MS SQL?

Будет ли эффективен индекс по b, созданый с условием ( left(b,L1) = 'prefix1' or left(b,L2) = 'prefix2' or left(b,L3) = 'prefix3' ...)?

Создавать вычисляемые поля и индексы по ним не особенно хочется, да и вообще, хорошо б сделать так, чтоб при вставке в таблицу выполнялось поменьше работы.

Можно ли, кстати, сделать в MS SQL индекс по null?
11 июн 12, 16:54    [12699773]     Ответить | Цитировать Сообщить модератору
 Re: Индекс по функции от поля  [new]
aleks2
Guest
Shlippenbaranus
Есть таблица A с полем b типа varchar. Нужно ускорить выборку из A по критерию b like 'prefix%', где prefix может принимать несколько разных и заранее известных значений, по факту - содержащих еще один префикс. Например:
'постоянный префикс-фиговина',
'постоянный префикс-фиговина2',
'постоянный префикс-фиговина2-фиговина3'
....


1. Условие b like 'prefix%' и так использует индекс по b - нифига лучшего не придумаешь.

2. left(b,L1) = 'prefix1' не использует индекс вопще. В MS SQL 3000 такая фишка появится.
11 июн 12, 17:19    [12699838]     Ответить | Цитировать Сообщить модератору
 Re: Индекс по функции от поля  [new]
Shlippenbaranus
Member

Откуда:
Сообщений: 241
aleks2
left(b,L1) = 'prefix1' не использует индекс вопще

Да, если я напишу
select * from A where left(b,L1) = 'prefix1'
, то индекс по b не будет использоваться.

Это понятно и соответствует базовым принциам.

Но если я напишу
select * from A where b like 'prefix%'
, а индекс создам при условии
left(b,L1) = 'prefix1'
- он будет работать? И будет ли такой индес создаваться быстрее, чем индекс по b?

Просто особенность задачи - меня интересуют только некоторые, строго определенные значения b, а создать просто индекс по b я хотел бы в последнюю очередь, поскольку не хочу задерживать вставку в таблицу. В таблицу постоянно кладется большое количество записей, а select-ы выполняются относительно редко и, в основном, не в часы пик.

Но иногда в часы пик они тоже нужны.

И можно ли сделать в MS SQL индекс по null?
11 июн 12, 17:47    [12699903]     Ответить | Цитировать Сообщить модератору
 Re: Индекс по функции от поля  [new]
Shlippenbaranus
Member

Откуда:
Сообщений: 241
Shlippenbaranus
aleks2
left(b,L1) = 'prefix1' не использует индекс вопще

Да, если я напишу
select * from A where left(b,L1) = 'prefix1'
, то индекс по b не будет использоваться.

Это понятно и соответствует базовым принциам.


Уточню, это если в MS SQL нет какой-нибудь хитрости, о которой я спрашивал. Я так понял, что нет.
11 июн 12, 18:09    [12699936]     Ответить | Цитировать Сообщить модератору
 Re: Индекс по функции от поля  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3754
Shlippenbaranus
Shlippenbaranus
пропущено...

Да, если я напишу
select * from A where left(b,L1) = 'prefix1'
, то индекс по b не будет использоваться.

Это понятно и соответствует базовым принциам.


Уточню, это если в MS SQL нет какой-нибудь хитрости, о которой я спрашивал. Я так понял, что нет.

Сделай поле в ваде функции. И индекс На это поле!
11 июн 12, 18:13    [12699942]     Ответить | Цитировать Сообщить модератору
 Re: Индекс по функции от поля  [new]
aleks2
Guest
Shlippenbaranus
1. Но если я напишу
select * from A where b like 'prefix%'
, а индекс создам при условии
left(b,L1) = 'prefix1'
- он будет работать? И будет ли такой индес создаваться быстрее, чем индекс по b?


2. И можно ли сделать в MS SQL индекс по null?


1. Фильтрованные индексы лучше создавать "в точности" под условие запроса, т.е. для
select * from A where b like 'prefix%'

лучше создать фильтрованный индекс
b like 'prefix%'


2. Можно. Чо попробовать то не судьба?
11 июн 12, 18:13    [12699943]     Ответить | Цитировать Сообщить модератору
 Re: Индекс по функции от поля  [new]
Shlippenbaranus
Member

Откуда:
Сообщений: 241
aleks2
Фильтрованные индексы лучше создавать "в точности" под условие запроса, т.е. для
select * from A where b like 'prefix%'

лучше создать фильтрованный индекс
b like 'prefix%'


Так нельзя же создать фильтрованный индекс с условием like. Это прямо указано в документации. Но теперь я смотрю, что и индекс с условием left(b,константа) = 'константа' тоже не создается, гхыр еп куррат! "Простая логика сравнения", которую можно использовать в индексах, какая-то уж очень примитивная. Похоже, что описанную мной задачу решить при помощи индекса с условием нельзя.

Ivan Durak
Сделай поле в ваде функции. И индекс На это поле!


Тогда уж лучше индексированное представление. Если и там для меня грабли не приготовили :)
12 июн 12, 18:35    [12703814]     Ответить | Цитировать Сообщить модератору
 Re: Индекс по функции от поля  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Shlippenbaranus
Так нельзя же создать фильтрованный индекс с условием like. Это прямо указано в документации.

А если попробовать ">" и "<"? Со строками эти операции тоже работают.
Правда, при дальнейшем поиске через like индекс использоваться не будет, он будет использоваться, если применять те же условия, что и в индексе.

Вот мой пример:

create table testtable
(ttext nvarchar(256))

-- ... заполняем тестовые данные

CREATE index test_index
on testtable
(ttext)
where ttext > 'О' and ttext < 'П'

select * from testtable
where ttext like 'О%'

select * from testtable
where ttext > 'О' and ttext < 'П'
-- Для этих запросов вместо выполнения смотрим план - он различается - во втором запросе используется индекс.
13 июн 12, 14:43    [12707955]     Ответить | Цитировать Сообщить модератору
 Re: Индекс по функции от поля  [new]
iap
Member

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

сравнение строк зависит от COLLATE, вообще-то.
В общем случае вполне возможно, что между 'О' и 'П' может быть ещё какая-нибудь буква...
Я уж молчу о регистрозависимости

В то же время запись 'О%' остаётся корректной в любом случае
13 июн 12, 15:13    [12708217]     Ответить | Цитировать Сообщить модератору
 Re: Индекс по функции от поля  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
iap, вам шашечки или ехать? :)
13 июн 12, 15:19    [12708273]     Ответить | Цитировать Сообщить модератору
 Re: Индекс по функции от поля  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Minamoto
iap, вам шашечки или ехать? :)
Дык едет всё и без всяких индексов!
В чём тогда проблема-то?
Медленно? Так это уже шашечки!

А если и правильность результата безразлична,
то зачем тогда вообще тратить своё время на всю эту чепуху?
Возвращаем что-нибудь простенькое "от балды" - и дело в шляпе!
13 июн 12, 15:25    [12708342]     Ответить | Цитировать Сообщить модератору
 Re: Индекс по функции от поля  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
iap
Minamoto
iap, вам шашечки или ехать? :)
Дык едет всё и без всяких индексов!
В чём тогда проблема-то?
Медленно? Так это уже шашечки!

А если и правильность результата безразлична,
то зачем тогда вообще тратить своё время на всю эту чепуху?
Возвращаем что-нибудь простенькое "от балды" - и дело в шляпе!


Иногда исправление "медленно" - это именно "ехать". То, что вы озвучили - это ограничения метода (в каких случаях его использовать нельзя, и на что стоит обратить внимание, чтобы не получить пустых данных), но не запрет на использование.
13 июн 12, 15:31    [12708400]     Ответить | Цитировать Сообщить модератору
 Re: Индекс по функции от поля  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Minamoto
iap
пропущено...
Дык едет всё и без всяких индексов!
В чём тогда проблема-то?
Медленно? Так это уже шашечки!

А если и правильность результата безразлична,
то зачем тогда вообще тратить своё время на всю эту чепуху?
Возвращаем что-нибудь простенькое "от балды" - и дело в шляпе!


Иногда исправление "медленно" - это именно "ехать". То, что вы озвучили - это ограничения метода (в каких случаях его использовать нельзя, и на что стоит обратить внимание, чтобы не получить пустых данных), но не запрет на использование.
Уж лучше запрет!

Если в будущем поменяют COLLATE базы,
то выгребать все эти ляпы будет ох как нелегко!
13 июн 12, 15:36    [12708439]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить