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.
=====
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
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!