如何使用oracle数据库加速hibernate条件'ilike queries'

ABX*_*ABX 7 oracle performance hibernate

我们正在使用hracle与oracle(11),并且由于使用了'ilike',不区分大小写'喜欢'而导致严重的性能问题.

java/hibernate代码如下所示:

 c1.add( Restrictions.ilike("address", address) );
Run Code Online (Sandbox Code Playgroud)

这导致sql语句如

 select * from ACCOUNT where lower(ADDRESS_1) = ?
Run Code Online (Sandbox Code Playgroud)

'lower'函数使oracle无法使用导致全表扫描的索引.

我正在考虑向db表引入一个新列,其中包含小写的地址内容.然后我可以使用:

c1.add( Restrictions.ilike("addressLCase", address.toLowerCase()) );
Run Code Online (Sandbox Code Playgroud)

...但我真的不喜欢将内容存储两次的想法......

然后我想到用小写创建一个索引

CREATE INDEX ADDRESS_1_IDX ON ACCOUNT  lower(  ADDRESS_1   )  ;
Run Code Online (Sandbox Code Playgroud)

但是这没用,因为我无法说服优化器使用这个索引......

那么我该如何使用hibernate准则API和'ilike'创建快速查询?

rse*_*nna 5

基于函数的索引将是我的选择.只记得:

  • 使用基于成本的优化程序.基于功能的索引仅对基于成本的优化程序可见,并且不会被基于规则的优化程序使用.

摘自该文章.