Intento resolver un problema de rendimiento de mi aplicación. La consulta de hibernación genera, es de la forma:Consulta de la aplicación Hibernate no utiliza índices DB
select *
from (
select this.a, this.b, this.state, this.id
from view_user this
where this.state=:1 order by this.a asc, this.b
)
where rownum <= :2
donde
- id es la clave primaria
- hay un combinado, índice único en (a, b, id).
- view_user tiene ~ 2 millones de entradas
- view_user realiza alguna une más a otras tablas
Edición
La consulta anterior realiza - rápido de SQLDeveloper - rápida de una pequeña aplicación Java con hibernación - extremadamente lento (> 100x más lento) de la aplicación con hibernación - los valores para las variables de vinculación son 2 respectivamente 30 (orígenes de rownum de paginación) : la consulta de hibernación es "de la forma" anterior. En realidad, hay alrededor de 20 columnas en la vista.
estado actual del análisis
- plan de consulta muestra que el índice se utiliza cuando la consulta proviene de SQLDeveloper o "aplicación de java pequeña".
- plan de consulta muestra que se realizan exploraciones de tablas completas si la consulta proviene de la aplicación de hibernación
- El rastreo de DB muestra solo dos diferencias: configuraciones de NLS (de SQLDeveloper) y formatos ligeramente diferentes (espacios en blanco). Todo lo demás parece ser la misma ...
Versiones
- de hibernación: 2.1.8
- controlador JDBC: Usados ojdbc14, 5 y 6. hace ninguna diferencia
- Oracle : 10.2 y 11. No hace ninguna diferencia
=> Me alegro de cualquier pista que alguien pueda tener sobre este tema. Lo que me preocupa es el hecho de que el seguimiento DB no mostró ninguna diferencia ... Sí, parece que se trata de hibernación. ¿Pero que? ¿Cómo detectar?
En aras de la exhaustividad, aquí la consulta de hibernación (desde el registro):
Select * from (
select this.USER_ID as USER_ID0_, this.CLIENT_ID as CLIENT_ID0_,
this.USER_NAME as USER_NAME0_, this.USER_FIRST_NAME as USER_FIR5_0_, this.USER_REMARKS as
USER_REM6_0_, this.USER_LOGIN_ID as USER_LOG7_0_, this.USER_TITLE as USER_TITLE0_,
this.user_language_code as user_lan9_0_, this.USER_SEX as USER_SEX0_,
this.USER_BIRTH_DATE as USER_BI11_0_, this.USER_TELEPHONE as USER_TE12_0_,
this.USER_TELEFAX as USER_TE13_0_, this.USER_MOBILE as USER_MO14_0_,
this.USER_EMAIL as USER_EMAIL0_, this.USER_ADDRESSLINE1 as USER_AD16_0_,
this.USER_ADDRESSLINE2 as USER_AD17_0_, this.USER_POSTALCODE as USER_PO18_0_,
this.USER_CITY as USER_CITY0_, this.USER_COUNTRY_CD as USER_CO20_0_,
this.USER_COUNTRY_NAME as USER_CO21_0_, this.USER_STATE_ID as USER_ST24_0_,
this.USER_STATE as USER_STATE0_, this.USER_TEMP_COLL_ID as USER_TE26_0_,
this.USER_TEMP_COLL_NAME as USER_TE27_0_, this.UNIT_ID as UNIT_ID0_,
this.CLIENT_NAME as CLIENT_38_0_, this.PROFILE_EXTID as PROFILE39_0_
from VIEW_USER this
where this.USER_STATE_ID=:1 order by this.USER_NAME asc, this.USER_FIRST_NAME asc
)
where rownum <= :2
índice único es más nombre_usuario, user_first_name, user_id.
Sospecho que tiene un error tipográfico en su consulta que ha introducido aquí, ya que la selección interna tiene dos 'donde' están en él. ¿La cláusula 'where rownum' en realidad está en la selección externa? – rejj
Usted dice que "view_user tiene ~ 2 entradas de mio". Por favor, defina "mio". Además, ¿cuáles son los valores posibles de view_user.state y cuántas filas para cada valor posible? Por último, ¿para qué valores se suministran: 1 y: 2? Gracias. –
sry, mio es un millón. El conjunto de devolución completo de la selección interna podría ser aproximadamente el 80% de la vista completa (usuario_verdad) debido a "this.state =: 1" con el valor 2 para: 1. –