2011-01-05 20 views
7

Estamos utilizando hibernate con Oracle (11) y tenemos graves problemas de rendimiento debido al uso de 'ilike', el caso insensible 'me gusta'.cómo acelerar los criterios de hibernación 'consultas ilike' con la base de datos Oracle

La java/hibernación código es el siguiente:

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

lo que se traduce en una instrucción SQL como

select * from ACCOUNT where lower(ADDRESS_1) = ? 

La función 'inferior' hace que sea imposible para Oracle para utilizar un índice que se traduce en una exploración de tabla completa.

Estaba pensando en introducir una nueva columna en la tabla db que contiene el menor contenido de la dirección. pude entonces utilizar:

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

... pero realmente no me gusta la idea de almacenar el contenido dos veces ...

Entonces pensé en la creación de un índice con minúsculas

CREATE INDEX ADDRESS_1_IDX ON ACCOUNT lower( ADDRESS_1 ) ; 

pero esto no funcionó, ya que no puedo convencer al optimizador de utilizar este índice ...

Entonces, ¿qué puedo hacer para crear una consulta rápida con criterios de hibernación activos y de productos 'me gusta' ?

Respuesta

5

El índice basado en función sería mi elección. Solo recuerda:

  • Usa el optimizador basado en el costo. Los índices basados ​​en funciones solo son visibles para el Optimizador Basado en Costos y el Optimizador Basado en la Regla nunca lo usará.

Extracto de this artículo.

Cuestiones relacionadas