2011-01-05 33 views
7

我們在oracle(11)中使用hibernate,並且由於'ilike'的使用導致嚴重的性能問題,不區分大小寫'like'。如何通過oracle數據庫加速休眠標準'ilike queries'

化java /休眠的代碼如下所示:

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

這導致在SQL語句等

select * from ACCOUNT where lower(ADDRESS_1) = ? 

的「下部」功能使得它不可能爲Oracle使用,這導致在索引全表掃描。

我正在考慮將新列引入包含地址小寫內容的數據庫表。 然後我可以使用:

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

...但我真的不喜歡這個主意來存儲內容兩倍...

後來我想用小寫

創建索引
CREATE INDEX ADDRESS_1_IDX ON ACCOUNT lower( ADDRESS_1 ) ; 

但這並沒有工作,因爲我無法說服優化器使用該索引...

所以我能做些什麼來創造與Hibernate API標準的快速查詢, '我喜歡' ?

回答

5

基於函數的索引是我的選擇。請記住:

  • 使用基於成本的優化器。基於功能的索引僅對基於成本的優化器可見,並且不會由基於規則的優化器使用。

摘自this的文章。