как ускорить критерий гибернации 'илике запросов' с базой данных оракула - PullRequest
7 голосов
/ 05 января 2011

Мы используем 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»?

1 Ответ

5 голосов
/ 05 января 2011

Индекс на основе функций будет моим выбором.Просто помните:

  • Используйте оптимизатор на основе затрат.Индексы на основе функций видны только оптимизатору на основе затрат и никогда не будут использоваться оптимизатором на основе правил.

Отрывок из этой статьи .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...