2011-01-05 104 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的文章。