Bonjour,
J'ai une certaine requête de type :
A l'origine, j'ai Tibco (pour ceux qui connaissent) qui appelle une procédure stockée qui contient cette requête et j'ai fini par déterminer que c'est cette requête qui prend PARFOIS (cf ci-dessous) un temps extrêmement long.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 select max(t1.DAT), t5.EEECHAMP1, t3.CCCCHAMP1 from AAA t1 join BBB t2 on t2.AAAIDT = t1.AAAIDT join CCC t3 on t3.BBBIDT = t2.BBBIDT join DDD t4 on t4.DDDIDT = t3.DDDIDT join EEE t5 on t5.EEEIDT = t4.EEEIDT where t1.AAACRIT1 = 2 and t1.DAT <= to_date('2012-07-05', 'YYYY-MM-DD') and t2.AAACRIT2 = 'TOTO' and t3.CCCCRIT1 = 123 group by t5.EEECHAMP1, t3.CCCCHAMP1
J'ai donc étudié le comportement avec CAST et SQL Developper.
-->1ère exécution du triplet {t1.DAT, t2.AAACRIT2, t3.CCCCRIT1} : environ 15 secondes (parfois plus)
-->2e et suivantes exécutions de la même requête : inférieur à 1 seconde
Pire : c'est pas la première fois de la journée, et ça ne le fait pas pour tous les triplets (il faudra maintenant que je recense chaque jour les t2.AAACRIT2, t3.CCCCRIT1 sur lesquels ça se produit).
J'ai fait tenter une fois l'expérience par quelqu'un qui a TOAD (évidemment tout ça sur la même base, même user) apparemment ça prendrait 3 secondes la première fois et 0.3 secondes ensuite (mieux mais bon, à la rigueur ce qui m'intéresse c'est surtout la différence 1ère fois / fois suivantes).
On m'a suggéré que c'était parce que la première fois Oracle met la requête en mémoire et c'est pour ça qu'ensuite ça va plus vite.
On m'a donc suggéré de faire la requête en version "variables bind"
-->je n'ai strictement rien gagné, même comportement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 stmt constant varchar2(1000) := 'select......' execute immediate stmt into V_EEECHAMP1, V_CCCCHAMP1 using I_DAT, I_AAACRIT2, I_CCCCRIT1;
Les index sont bien posés, les stats calculées, etc.
Enfin à noter que ce problème arrive assez rarement en PROD, de temps à autre en UAT, et tous les jours en DEV (donc il y a peut-être une histoire de performance de machine et/ou de paramétrage).
Et c'est même pas une question de quantité de données puisque j'en ai 25% de plus en UAT qu'en DEV et pourtant ça va moins bien en DEV.
Vu que mes DBA sont à court d'idée, peut-être avez-vous une idée sur la question.
Merci.
Partager