Риторический вопрос про индексы

Запросы, планы, оптимизация запросов, ...

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

Ответить
Любопытный
Сообщения: 5
Зарегистрирован: 04 мар 2006, 11:50

Риторический вопрос про индексы

Сообщение Любопытный » 04 мар 2006, 12:20

Интересно почему нет upper index для varchar Char.
Было бы очень удобно для разработчика вместо создания дополнительного поля
для быстрого поиска по UpperCase создавать upper index
серверу то разницы ни какой, а людям удобно и размер экономит.

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

Сообщение kdv » 04 мар 2006, 23:36

читаем про индексы по выражениям в Yaffil и Firebird 2.

Любопытный
Сообщения: 5
Зарегистрирован: 04 мар 2006, 11:50

Сообщение Любопытный » 06 мар 2006, 06:43

Дествительно Firebird 2.0 уже умеет (computed by) скачал и попробовал, так гораздо интереснее.

Любопытный
Сообщения: 5
Зарегистрирован: 04 мар 2006, 11:50

Сообщение Любопытный » 06 мар 2006, 14:07

Хотя некоторые неприятности все таки в FB 2.0 есть

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

   select Name
   from Table 
   where upper(Name)=upper(:Name)
уже работает без индекса натуралом.
Все прочие варианты где в правой части что-то выполняется,
либо имеется параметр работают точно также(натуралом) :(

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 07 мар 2006, 14:34

должен индекс использоваться. Пример натурала (на скрипте) привести можешь? И заодно - какой билд FB2?

Любопытный
Сообщения: 5
Зарегистрирован: 04 мар 2006, 11:50

Сообщение Любопытный » 09 мар 2006, 05:56

FB версия -2.0.0.12169 Firebird 2.0 Beta 2
таблица "Detail" 2 поля
  • id integer
    Name varchar(100)
создаем индекс по Name

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

CREATE INDEX "IDX_Detail_UName" ON "Detail" computed by (upper("Name");
для выборки

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

SELECT
    "Name"
FROM
   "Detail"
where upper("Name") like 'IC%'
все нормально индекс используется

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

 PLAN ("Detail" INDEX ("IDX_Detail_UName"))
а если выбираем уже с вычислением то натуралом

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

SELECT
    "Name"
FROM
   "Detail"
where upper("Name") like upper('IC%')

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 09 мар 2006, 07:42

казалось бы, причем тут индексы по выражениям :-) От вида индексов это никак не зависит, для обычных тоже самое. Потому что LIKE оптимизируется через индекс _только_ в случае шаблона-константы, у которого первые символы не шаблонные. Твой UPPER оптимизатор вычислять не собирается, поэтому поступает как для параметра - идет натуралом. Это абсолютно ожидаемо.

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

Сообщение kdv » 09 мар 2006, 10:28

отсюда вывод - почему бы константы для сравнения не передавать с клиента сразу в upper? Зачем их надо передавать на сервер в "сыром" виде, чтобы именно сервер переводил их в верхний регистр?

Любопытный
Сообщения: 5
Зарегистрирован: 04 мар 2006, 11:50

Сообщение Любопытный » 09 мар 2006, 14:00

dimitr спасибо за разъяснения индекс не используется из-за LIKE
kdv Спасибо за ответ К такому же выводу пришел и я

Ответить