web-dev-qa-db-fra.com

Query hibernate fonctionnant lentement

Je suis actuellement confronté à un problème avec une requête d'hibernate lente qui est lancée à partir d'un fichier Java Programme. Il appelle à Oracle 11G à la fin de la fin.

Cette requête prend n'importe quoi de 40 à 90 secondes la première fois qu'elle est courante. Lors des exécutions ultérieures, toutefois, la requête est renvoyée dans une fraction de l'heure (et je ne vois même pas la base de données touchée, alors supposez que Hibernate la met en cache).

Si je copie et collez la requête d'Enterprise Manager dans un client SQL et exécutez la même requête directe (même en modifiant quelques paramètres), la requête retourne dans une fraction d'une seconde.

Si je regarde l'onglet Tuning de la performance, je vois que le temps pris est principalement adopté avec les attentes d'E/S utilisateur (97,5%) et de la CPU (2,5%). Cela pourrait-il signifier que la taille d'extraction que j'utilise dans Hibernate est configurée à une valeur trop faible?

S'il y a d'autres informations, vous devrez peut-être m'aider au bas de ce problème, veuillez me le faire savoir.

=====

Informations Complémentaires:

Nous avons un index sur la table et je peux voir qu'il est utilisé dans le cadre de l'exécution de la requête, malheureusement ce n'est pas très lisible mais je ne sais pas comment l'inclure d'autrui:

Id  Operation   Name    Rows
(Estim)     Cost    Time
Active(s)   Start
Active  Execs   Rows
(Actual)    Read
Reqs    Read
Bytes   Mem
(Max)   Activity
(%)     Activity Detail
(# samples)
0   SELECT STATEMENT                        1                       
1   . FILTER                        1                       
2   .. HASH JOIN RIGHT OUTER        2674    7223    1   +4  1   0           1M      
3   ... TABLE ACCESS FULL   TOTEM_EQ_EXPIRYCODES    475     4   1   +4  1   481                     
4   ... HASH JOIN RIGHT OUTER       2674    7219    1   +4  1   0           399K        
5   .... TABLE ACCESS BY INDEX ROWID    TOTEM_EQ_UNDERLYINGS    1   2   1   +4  1   1                   
6   ..... INDEX UNIQUE SCAN     TOTEM_EQ_UND_PK     1   1   1   +4  1   1                   
7   .... NESTED LOOPS                       1                       
8   ..... NESTED LOOPS      2674    7216    42  +4  1   0                   
9   ...... TABLE ACCESS BY GLOBAL INDEX ROWID   EQUITIES_MONTHLY_INSTRUMENTS    2671    1871    45  +1  1   8438    3517    27MB        24.44   db file sequential read (11)
10  ....... INDEX RANGE SCAN    EQ_MON_INS_UNDERLYING_INDX  2671    12  42  +4  1   8438    27  216KB           
11  ...... PARTITION RANGE ITERATOR         1   2           8438                        
12  ....... INDEX RANGE SCAN    EQ_MON_RESULT_INSPT_UNQ     1   2   44  +2  8438    0   5403    42MB        75.56   Cpu (1)
db file sequential read (33)
13  ..... TABLE ACCESS BY LOCAL INDEX ROWID     EQUITIES_MONTHLY_RESULTS    1   3                   

Here are the Global stats:

Elapsed
Time(s)     Cpu
Time(s)     IO
Waits(s)    Fetch
Calls   Buffer
Gets    Read
Reqs    Read
Bytes
45  0.73    45  1   22980   9740    76MB            
5
platinum_pidgeon

Il s'avère que le problème était de faire avec l'indice qui a été sélectionné dans le cadre du plan de requête.

La requête acceptait une gamme dans le cadre de son ensemble de paramètres. Pour des raisons pour des raisons pour des raisons pour lesquelles je ne vais pas aller maintenant, nous passions à la date de début et de fin de la plage d'être la même valeur.

Lorsque nous faisions appel à l'appel direct, nous étions codés sur ces paramètres et Oracle déduisant qu'ils représentaient une seule date, alors que lorsqu'ils les transmettent via le code, la plage a été transmise en tant que variables de liaison.

Cela signifiait que Oracle choisi pour numériser toutes les partitions dans un cas, et contre une partition spécifique de l'autre.

Nous avons finalement corrigé la requête en passant dans un seul paramètre de date, car nous avons réalisé que nous n'avions pas besoin de gamme!

Une situation plutôt particulière certes!

0
platinum_pidgeon