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

Откуда:
Сообщений: 86
Господа доброго времени суток.

Имею
SQL Server 2000
БД и табличку в ней.

БД и таблица создавались таким образом, чтобы можно было вести регистрозависимый поиск (like).

В таблице есть поле F1 и индекс на него. Записей в таблице 1 500 000.

Я выполняю следующий запрос select top 1 ID where F1 like 'Э%' и этот запрос отрабатывает очень быстро. План запроса указывает, что у меня используется необходимый индекс и ему делается Index Seek. Причем, в таблице все записи поля F1 начинаются с 'Э', поэтому он так быстро и отрабатывает.

Если же я укажу следующий запрос select top 1 ID where F1 like 'э%' - буковка стала маленькой. То он будет выполняться достаточно долго (около 7 секунд). В результате скажет, что таких записей нет и будет прав - их действительно нет. План запроса по-прежнему указывает на Index Seek. Вот собственно вопрос:

В чем заключается Index Seek и как он работает, если для такого глупого запроса нужно столько времени? Похоже тут идет тупое сканирование таблицы. Потому как если бы это был поиск делением отрезка пополам, например, то отработал бы он мгновенно. Такое ощущение, что индекс все же не используется.

Объясните пожалуйста что происходит?

Спасибо.
19 окт 05, 15:11    [1984319]     Ответить | Цитировать Сообщить модератору
 Re: like и индекс  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
автор
То он будет выполняться достаточно долго (около 7 секунд). В результате скажет, что таких записей нет и будет прав - их действительно нет. План запроса по-прежнему указывает на Index Seek.


И это был реальный план (Ctrl+K и выполнение в QA) или estimated (Ctrl+L в QA)?
19 окт 05, 15:17    [1984350]     Ответить | Цитировать Сообщить модератору
 Re: like и индекс  [new]
Брюлик
Member

Откуда:
Сообщений: 690
Конечно индех испльзуется если ты видишь index seek

Проблема может в том что ты используешь TOP Clause (кстати без ORDER BY clause,почему?) Скореи всего в плане ты увидишь сортировку по ID ,что собственно замедляет процесс, (ID имеет индекс ?)
19 окт 05, 15:31    [1984452]     Ответить | Цитировать Сообщить модератору
 Re: like и индекс  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
кто вам сказал что в сиквел сервере поиск по индексу осуществляется делением отрезка пополам? вы попробуйте убрать индекс, сколько будет отрабатываться этот запрос?

для спящего время бодрствования равносильно сну
19 окт 05, 15:33    [1984469]     Ответить | Цитировать Сообщить модератору
 Re: like и индекс  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
при топ 1, сервер без указания явных сортировок вернет то, что первое попадется.

для спящего время бодрствования равносильно сну
19 окт 05, 15:37    [1984499]     Ответить | Цитировать Сообщить модератору
 Re: like и индекс  [new]
johnRSDN
Member

Откуда:
Сообщений: 86
To pkarklin
оба плана одинаковы

To Брюлик
ID имеет индек - это PK

To Алексей2003
По поводу деления отрезка пополам. Я только предположил. Сам я не знаю какой используется алгоритм. Подскажите каким образом мне написать запрос или какие создать индексы, чтобы такой вот like на несуществующую комбинацию шустро бы отрабатывал?


PS
Забыл указать. поле F1 not null
19 окт 05, 15:42    [1984532]     Ответить | Цитировать Сообщить модератору
 Re: like и индекс  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541

Фактически операция like 'э%' эквивалентна between 'э' and 'эя' (для русского языка) Можешь попробовать изменить условие на
between - теоретически скорость должна возрасти.


Posted via ActualForum NNTP Server 1.3

19 окт 05, 15:52    [1984600]     Ответить | Цитировать Сообщить модератору
 Re: like и индекс  [new]
MCMXCVIII
Member

Откуда:
Сообщений: 130
CREATE INDEX ind1 ON ( F1 )
go

select top 1 ID from ? with(index = ind1) where F1 like 'Э%'
19 окт 05, 15:54    [1984608]     Ответить | Цитировать Сообщить модератору
 Re: like и индекс  [new]
MCMXCVIII
Member

Откуда:
Сообщений: 130
Roman S. Golubin

Фактически операция like 'э%' эквивалентна between 'э' and 'эя' (для русского языка) Можешь попробовать изменить условие на
between - теоретически скорость должна возрасти.


Posted via ActualForum NNTP Server 1.3


А для не-русского :

where F1 >= 'э' and F1 < char(ascii('э') + 1)
19 окт 05, 15:57    [1984630]     Ответить | Цитировать Сообщить модератору
 Re: like и индекс  [new]
ChA
Member

Откуда: Москва
Сообщений: 11136
Roman S. Golubin

Фактически операция like 'э%' эквивалентна between 'э' and 'эя' (для русского языка) Можешь попробовать изменить условие на
between - теоретически скорость должна возрасти.
Если последить за планом запроса, то часто сервер ровно это и делает :)
19 окт 05, 16:16    [1984775]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить