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

ЧАстые Вопросы и Ответы

Модераторы: kdv, CyberMax

Ответить
mdfv
Сообщения: 119
Зарегистрирован: 23 май 2006, 15:53

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

Сообщение mdfv » 03 апр 2007, 12:32

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

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

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

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

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 03 апр 2007, 13:21

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 03 апр 2007, 15:50

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

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

Ответить