Мы используем hibernate с oracle (11) и испытываем серьезные проблемы с производительностью из-за использования «ilike», нечувствительного к регистру «like».
Код Java / Hibernate выглядит так:
c1.add( Restrictions.ilike("address", address) );
, что приводит к SQL-выражению типа
select * from ACCOUNT where lower(ADDRESS_1) = ?
Функция 'lower' не позволяет oracle использовать индекс, который приводит к полному сканированию таблицы.
Я думал о введении нового столбца в таблицу БД, которая содержит строчные буквы адреса.
Я мог бы тогда использовать:
c1.add( Restrictions.ilike("addressLCase", address.toLowerCase()) );
... но мне действительно не нравится идея хранить контент дважды ...
Тогда я подумал о создании индекса в нижнем регистре
CREATE INDEX ADDRESS_1_IDX ON ACCOUNT lower( ADDRESS_1 ) ;
но это не сработало, поскольку я не могу убедить оптимизатор использовать этот индекс ...
Итак, что я могу сделать, чтобы создать быстрый запрос с API критериев гибернации и «ilike»?