Bonjour

Je viens d'installer un nouveau serveur avec BDD Oracle 11g pour délester un serveur avec Oracle 10G.

C'est deux serveurs (Virtuels) ont les mêmes spécifications hardware.

Mon problème et quel e serveur 11 G est moins performant que mon serveur 10G.....en tout cas pour une requete.

Sur le serveur 10G 12 secondes de Traitement, sur le serveur 11G 1minute et des poussieres......

Cette requete est construite via un document Webi sur un Univers BO XI R2 et voici a quoi elle ressemble

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
SELECT
  VEHICULE.PARC,
  T_AFFECT4.CLIENT,
  T_AFFECT2.FILIALE,
  sum(DONNEE_TX.DISTANCE),
  DONNEE_TX.CONSO_TOT_AVG,
  sum(DONNEE_TX.CONSO_TOTAL),
  DONNEE_TX.DATEJ,
  to_char(DONNEE_TX.DATEJ,'WW'),
  nvl(INDIVIDU.NOM, TR_TRA_PERSON.NM_NAME),
  ETABSECT.LIB,
  SOCIETE.RAIS,
  DONNEE_TX.ID_CONDUCTEUR,
  DONNEE_TX.SPEED_AVG,
   case   when (MONTHS_BETWEEN(sysdate,to_date(INDIVIDU.dnai,'YYYYMMDD'))/12)<30  then '1- Moins de 30 Ans' when MONTHS_BETWEEN(sysdate,to_date(INDIVIDU.dnai,'YYYYMMDD'))/12 >= 30 and MONTHS_BETWEEN(sysdate,to_date(INDIVIDU.dnai,'YYYYMMDD'))/12 < 40 then '2- De 30 à 39 Ans' when MONTHS_BETWEEN(sysdate,to_date(INDIVIDU.dnai,'YYYYMMDD'))/12 >= 40 and MONTHS_BETWEEN(sysdate,to_date(INDIVIDU.dnai,'YYYYMMDD'))/12 < 50 then '3- De 40 à 49 Ans' when MONTHS_BETWEEN(sysdate,to_date(INDIVIDU.dnai,'YYYYMMDD'))/12 >= 50 then '4- Plus de 50 ans'  end,
  sum(DONNEE_TX.CONSO_IDLE),
  sum(DONNEE_TX.CONSO_COND),
  MARQUE.LIBELLE,
  CATVEHIC.LIBELLE,
  decode(INDIVIDU.SEXE,'F','Femme','Homme'),
  to_char(DONNEE_TX.DATEJ,'YYYYMM'),
  round(MONTHS_BETWEEN(sysdate,to_date(INDIVIDU.dnai,'YYYYMMDD'))/12,2)
FROM
  VEHICULE,
  t_AFFECT4,
  t_AFFECT2,
  DONNEE_TX,
  TR_TRA_PERSON,
  INDIVIDU,
  ETABSECT,
  SOCIETE,
  MARQUE,
  CATVEHIC,
  VEHICULE_AFFECTATION,
  INFSAL
WHERE
  ( VEHICULE_AFFECTATION.ID_VEHICULE=DONNEE_TX.PARCID and VEHICULE_AFFECTATION.DATE_DEBUT<=DONNEE_TX.DATEJ and VEHICULE_AFFECTATION.DATE_FIN>DONNEE_TX.DATEJ  )
  AND  ( VEHICULE_AFFECTATION.ID_CLIENT=T_AFFECT4.ID_AFFECT4  )
  AND  ( VEHICULE_AFFECTATION.ID_FILIALE=T_AFFECT2.ID_AFFECT2  )
  AND  ( DONNEE_TX.PARCID=VEHICULE.VEHICULE_ID  )
  AND  ( DONNEE_TX.ID_CONDUCTEUR=TR_TRA_PERSON.CNR_EXTCODE  )
  AND  ( VEHICULE.COD_CATEGORIE=CATVEHIC.COD_CATEGORIE  )
  AND  ( VEHICULE.MARQUE=MARQUE.COD_MARQUE  )
  AND  ( INFSAL.NOBUL(+)=1 and( DONNEE_TX.id_conducteur=to_char(INFSAL.individu(+)) and  to_number(to_char(DONNEE_TX.datej,'YYYYMM'))= case when to_char(sysdate,'DD')<='09' then to_number(to_char(add_months(to_date(INFSAL.anmois(+),'YYYYMM'),2),'YYYYMM'))  when   to_char(DONNEE_TX.datej,'YYYYMM')=to_char(sysdate,'YYYYMM') then  to_number(to_char(add_months(to_date(INFSAL.anmois(+),'YYYYMM'),1),'YYYYMM'))  else to_number(INFSAL.anmois(+)) end  )  )
  AND  ( to_char(INDIVIDU.INDIVIDU(+))=DONNEE_TX.ID_CONDUCTEUR  )
  AND  ( INFSAL.SOCIETE=ETABSECT.SOCIETE(+) AND INFSAL.ETAB=ETABSECT.ETAB(+) AND INFSAL.SECTION=ETABSECT.SECTION(+)  )
  AND  ( INFSAL.SOCIETE=SOCIETE.SOCIETE(+)  )
  AND  
  (
   (
    SOCIETE.RAIS  =  'GT BRETAGNE'
    OR
    T_AFFECT2.FILIALE  =  'BRETAGNE'
   )
   AND
   DONNEE_TX.CONSO_TOT_AVG  >  0
   AND
   DONNEE_TX.IND_CONF  =  '0'
   AND
   to_char(DONNEE_TX.DATEJ,'YYYYMM')  =  '201209'
  )
GROUP BY
  VEHICULE.PARC, 
  T_AFFECT4.CLIENT, 
  T_AFFECT2.FILIALE, 
  DONNEE_TX.CONSO_TOT_AVG, 
  DONNEE_TX.DATEJ, 
  to_char(DONNEE_TX.DATEJ,'WW'), 
  nvl(INDIVIDU.NOM, TR_TRA_PERSON.NM_NAME), 
  ETABSECT.LIB, 
  SOCIETE.RAIS, 
  DONNEE_TX.ID_CONDUCTEUR, 
  DONNEE_TX.SPEED_AVG, 
   case   when (MONTHS_BETWEEN(sysdate,to_date(INDIVIDU.dnai,'YYYYMMDD'))/12)<30  then '1- Moins de 30 Ans' when MONTHS_BETWEEN(sysdate,to_date(INDIVIDU.dnai,'YYYYMMDD'))/12 >= 30 and MONTHS_BETWEEN(sysdate,to_date(INDIVIDU.dnai,'YYYYMMDD'))/12 < 40 then '2- De 30 à 39 Ans' when MONTHS_BETWEEN(sysdate,to_date(INDIVIDU.dnai,'YYYYMMDD'))/12 >= 40 and MONTHS_BETWEEN(sysdate,to_date(INDIVIDU.dnai,'YYYYMMDD'))/12 < 50 then '3- De 40 à 49 Ans' when MONTHS_BETWEEN(sysdate,to_date(INDIVIDU.dnai,'YYYYMMDD'))/12 >= 50 then '4- Plus de 50 ans'  end, 
  MARQUE.LIBELLE, 
  CATVEHIC.LIBELLE, 
  decode(INDIVIDU.SEXE,'F','Femme','Homme'), 
  to_char(DONNEE_TX.DATEJ,'YYYYMM'), 
  round(MONTHS_BETWEEN(sysdate,to_date(INDIVIDU.dnai,'YYYYMMDD'))/12,2)
HAVING
  sum(DONNEE_TX.DISTANCE)  >  0
En cherchant d'ou pouvait provenir le problème j'ai refait la requete à la main en sortant les jointures de mon Where et la miracle 12 secondes pour répondre. Voici la requete, celle ci renvoie les même données.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
select 
   VEHICULE.PARC,
  T_AFFECT4.CLIENT,
  T_AFFECT2.FILIALE,
  sum(DONNEE_TX.DISTANCE),
  DONNEE_TX.CONSO_TOT_AVG,
  sum(DONNEE_TX.CONSO_TOTAL),
  DONNEE_TX.DATEJ,
  to_char(DONNEE_TX.DATEJ,'WW'),
  nvl(INDIVIDU.NOM, TR_TRA_PERSON.NM_NAME),
  ETABSECT.LIB,
  SOCIETE.RAIS,
  DONNEE_TX.ID_CONDUCTEUR,
  DONNEE_TX.SPEED_AVG,
   case   when (MONTHS_BETWEEN(sysdate,to_date(INDIVIDU.dnai,'YYYYMMDD'))/12)<30  then '1- Moins de 30 Ans' when MONTHS_BETWEEN(sysdate,to_date(INDIVIDU.dnai,'YYYYMMDD'))/12 >= 30 and MONTHS_BETWEEN(sysdate,to_date(INDIVIDU.dnai,'YYYYMMDD'))/12 < 40 then '2- De 30 à 39 Ans' when MONTHS_BETWEEN(sysdate,to_date(INDIVIDU.dnai,'YYYYMMDD'))/12 >= 40 and MONTHS_BETWEEN(sysdate,to_date(INDIVIDU.dnai,'YYYYMMDD'))/12 < 50 then '3- De 40 à 49 Ans' when MONTHS_BETWEEN(sysdate,to_date(INDIVIDU.dnai,'YYYYMMDD'))/12 >= 50 then '4- Plus de 50 ans'  end,
  sum(DONNEE_TX.CONSO_IDLE),
  sum(DONNEE_TX.CONSO_COND),
  MARQUE.LIBELLE,
  CATVEHIC.LIBELLE,
  decode(INDIVIDU.SEXE,'F','Femme','Homme'),
  to_char(DONNEE_TX.DATEJ,'YYYYMM'),
  round(MONTHS_BETWEEN(sysdate,to_date(INDIVIDU.dnai,'YYYYMMDD'))/12,2)
 from donnee_tx 
    left join infsal on infsal.anmois=to_number(to_char(datej,'YYYYMM')) and to_char(infsal.individu)=donnee_tx.id_conducteur and nobul=1 and anmois='201209'
    left join individu on to_char(individu.individu)=donnee_tx.id_conducteur
    join vehicule_affectation on  VEHICULE_AFFECTATION.ID_VEHICULE=DONNEE_TX.PARCID and VEHICULE_AFFECTATION.DATE_DEBUT<=DONNEE_TX.DATEJ and VEHICULE_AFFECTATION.DATE_FIN>DONNEE_TX.DATEJ
    join T_AFFECT4 on VEHICULE_AFFECTATION.ID_CLIENT=T_AFFECT4.ID_AFFECT4 
    join T_AFFECT2 on VEHICULE_AFFECTATION.ID_FILIALE=T_AFFECT2.ID_AFFECT2
    join vehicule on  DONNEE_TX.PARCID=VEHICULE.VEHICULE_ID  
    join TR_TRA_PERSON on  DONNEE_TX.ID_CONDUCTEUR=TR_TRA_PERSON.CNR_EXTCODE
    join MARQUE on VEHICULE.MARQUE=MARQUE.COD_MARQUE
    join CATVEHIC on VEHICULE.COD_CATEGORIE=CATVEHIC.COD_CATEGORIE 
   left  join SOCIETE on  INFSAL.SOCIETE=SOCIETE.SOCIETE
    left join ETABSECT on INFSAL.SOCIETE=ETABSECT.SOCIETE AND INFSAL.ETAB=ETABSECT.ETAB AND INFSAL.SECTION=ETABSECT.SECTION  
where 
  (
   (
    SOCIETE.RAIS  =  'GT BRETAGNE'
    OR
    T_AFFECT2.FILIALE  =  'BRETAGNE'
   )
   AND
   DONNEE_TX.CONSO_TOT_AVG  >  0
   AND
   DONNEE_TX.IND_CONF  =  '0'
   AND
   to_char(DONNEE_TX.DATEJ,'YYYYMM')  = '201209'
  )
   group by 
    VEHICULE.PARC,
  T_AFFECT4.CLIENT,
  T_AFFECT2.FILIALE,
  DONNEE_TX.CONSO_TOT_AVG,
  DONNEE_TX.DATEJ,
  to_char(DONNEE_TX.DATEJ,'WW'),
  nvl(INDIVIDU.NOM, TR_TRA_PERSON.NM_NAME),
  ETABSECT.LIB,
  SOCIETE.RAIS,
  DONNEE_TX.ID_CONDUCTEUR,
  DONNEE_TX.SPEED_AVG,
   case   when (MONTHS_BETWEEN(sysdate,to_date(INDIVIDU.dnai,'YYYYMMDD'))/12)<30  then '1- Moins de 30 Ans' when MONTHS_BETWEEN(sysdate,to_date(INDIVIDU.dnai,'YYYYMMDD'))/12 >= 30 and MONTHS_BETWEEN(sysdate,to_date(INDIVIDU.dnai,'YYYYMMDD'))/12 < 40 then '2- De 30 à 39 Ans' when MONTHS_BETWEEN(sysdate,to_date(INDIVIDU.dnai,'YYYYMMDD'))/12 >= 40 and MONTHS_BETWEEN(sysdate,to_date(INDIVIDU.dnai,'YYYYMMDD'))/12 < 50 then '3- De 40 à 49 Ans' when MONTHS_BETWEEN(sysdate,to_date(INDIVIDU.dnai,'YYYYMMDD'))/12 >= 50 then '4- Plus de 50 ans'  end,
  MARQUE.LIBELLE,
  CATVEHIC.LIBELLE,
  decode(INDIVIDU.SEXE,'F','Femme','Homme'),
  to_char(DONNEE_TX.DATEJ,'YYYYMM'),
  round(MONTHS_BETWEEN(sysdate,to_date(INDIVIDU.dnai,'YYYYMMDD'))/12,2)
  HAVING  sum(DONNEE_TX.DISTANCE)  >  0
Est ce que ce problème de perf et du a un mauvais paramétrage de mon serveur? à la version de Oracle? Peut etre au fait que la requête n'est pas super optimisé. Mais dans ce cas pourquoi un tel écart.
Je tiens à préciser que certaines des tables sont des synonyms faisant référence a une autre BDD via un Dblink.

Je n'ai fait aucun paramétrage spécifique sur mon serveur 11G car je n'y connais pas grand chose en Oracle.

D'avance merci de votre aide