2011-01-05 21 views
7

Używamy hibernacji z Oracle (11) i mamy poważne problemy z wydajnością ze względu na użycie "ilike", bez względu na wielkość liter "jak".jak przyspieszyć kryteria hibernacji "ilike zapytania" z bazą danych oracle

Java/hibernacji kod wygląda następująco:

c1.add(Restrictions.ilike("address", address)); 

co skutkuje sql jak

select * from ACCOUNT where lower(ADDRESS_1) = ? 

Funkcja „niższe” uniemożliwia wyrocznią w użyciu indeks co skutkuje pełne skanowanie tabeli.

Zastanawiam się nad wprowadzeniem nowej kolumny do tabeli db, która zawiera małą literę adresu. Mógłbym wtedy użyć:

c1.add(Restrictions.ilike("addressLCase", address.toLowerCase())); 

... ale ja naprawdę nie podoba mi się pomysł, aby zapisać zawartość dwukrotnie ...

Wtedy pomyślałem tworzenia indeksu z małymi literami

CREATE INDEX ADDRESS_1_IDX ON ACCOUNT lower( ADDRESS_1 ) ; 

ale to nie działa, ponieważ nie mogę przekonać optymalizator używać tego indeksu ...

Więc co można zrobić, aby stworzyć szybki zapytanie kryteria hibernacji API i 'lubię' ?

Odpowiedz

5

Indeks oparty na funkcjach byłby moim wyborem. Pamiętaj tylko:

  • Użyj optymalizatora opartego na kosztach. Indeksy oparte na funkcjach są widoczne tylko dla Optymalizatora kosztowego i nie będą używane przez Optymalizator oparty na zasadach.

Fragment artykułu this.

Powiązane problemy