Bonjour,

J'ai une certaine requête de type :
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
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.

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"
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;
-->je n'ai strictement rien gagné, même comportement.

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.