Страница 1 из 1

varchar, starting with и индексы которых нет

Добавлено: 03 апр 2007, 12:32
mdfv
Заметил странную вещь, в документах такого не нашел.
Индексы по полю varchar отсутствуют.
При использования
запроса вида:

Код: Выделить всё

select * from table
where UPPER(fio) starting with('ШИ')
при натуральном плане перебор идет не всех записей (~20 тыс)
если прописать starting with('ШИШКИН') то идет чтение уже всех записей(~80 тыс) при том же натуральном плане, и по времени исполнения это заметно.
если убрать UPPER то в некоторых случаях тоже пойдет перебор не всех записей, в зависимости от их количества(селективности?) в базе.

Где-нибудь есть описание как это и в каких случаях работает?
По умолчанию строится некий невидимый индекс по первым символам поля varchar?

Добавлено: 03 апр 2007, 13:21
Dimitry Sibiryakov
Все зависит от того, сколько записей ты зафетчил на клиента, IMHO. Добавь Fetch All, ORDER BY или count(*) и все должно уравняться.
Никаких индексов "на лету" не строится.

Добавлено: 03 апр 2007, 15:50
kdv
никаких "некоторых случаев" нет.
Без индекса поиск будет всегда идти перебором, с одинаковой скоростью и одинаковым планом, не зависимо от upper или содержимого строки поиска.

Ты скорее всего видишь разницу между первым и последующим выполнением одного и того же запроса. Страницы данных закэшировались после первого выполнения, только и всего.