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

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

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

Добавлено: 04 мар 2006, 23:36
kdv
читаем про индексы по выражениям в Yaffil и Firebird 2.

Добавлено: 06 мар 2006, 06:43
Любопытный
Дествительно Firebird 2.0 уже умеет (computed by) скачал и попробовал, так гораздо интереснее.

Добавлено: 06 мар 2006, 14:07
Любопытный
Хотя некоторые неприятности все таки в FB 2.0 есть

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

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

Добавлено: 07 мар 2006, 14:34
dimitr
должен индекс использоваться. Пример натурала (на скрипте) привести можешь? И заодно - какой билд FB2?

Добавлено: 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%')

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

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

Добавлено: 09 мар 2006, 14:00
Любопытный
dimitr спасибо за разъяснения индекс не используется из-за LIKE
kdv Спасибо за ответ К такому же выводу пришел и я