[SQL-ORACLE] Optimisation?

Fermé
Bj0 Messages postés 74 Date d'inscription mercredi 25 avril 2007 Statut Membre Dernière intervention 5 octobre 2007 - 5 juin 2007 à 16:09
 TIZIRI3 - 28 févr. 2008 à 17:02
je ne comprend pas trés bien mes temps d'exécution de ma Requete SQL que j 'exécute sur une base de données oracle.
Ma requete est bien évidenment longue a s'exécuter ( 1 UNION et une jointure de 4 tables dans chaque partie et ces tables peuvent atteindre plus de 20 M de lignes (M= Million bien sur :p))
la voici (attention aux yeux :D ) :

(SELECT
  substr((D.VAL_NUMERIQUE_15/3600000),1,3) as FV,
  A.MATRICULE_EMPLOYE as matricule,
  substr(D.ID_EMPLOYE,1,5)as ID,
  to_char (B.DTJ_DEB,'YYYYMMDD'),
  to_char (B.DTJ_FIN,'YYYYMMDD'),
  substr(C.VALEUR_CARACTERE,1,1),
  (to_char (D.DTJ_VALORISATION,'YYYYMMDD'))
FROM
  EMP_EMPLOYES A,
  EMP_PERIODES B,
  DIC_VALEURS_CHP_HISTOS_SYNTHES C,
  CPT_VALEURS_YYYYXX1 D
WHERE
    (   A.ID_EMPLOYE = B.ID_EMPLOYE 
    AND A.ID_EMPLOYE = C.ID_ENTITE_FONCTIONNELLE(+)
    AND A.ID_EMPLOYE = D.ID_EMPLOYE
    AND
        B.DTJ_FIN between C.DTJ_DEB and C.DTJ_FIN
    AND B.DTJ_FIN = D.DTJ_VALORISATION 
    AND to_char (B.DTJ_FIN ,'YYYYMMDD') BETWEEN  
	#DATE_DEBUT#
	AND #DATE_FIN#
    AND 
          A.MATRICULE_EMPLOYE BETWEEN '01' AND '51'
    AND 
        C.ID_CHAMP_PERSO  =  'H30'
     AND  A.ID_EMPLOYE  in 
     (
     SELECT
       ID_ENTITE_FONCTIONNELLE
       FROM
       DIC_VALEURS_CHP_HISTOS_SYNTHES
       WHERE
           ID_CHAMP_PERSO   =  'J10'
       AND VALEUR_CARACTERE =  '0'
     ) 
    )
)
UNION
(SELECT
  substr((D.VAL_NUMERIQUE_15/3600000),1,3) as FV,
  A.MATRICULE_EMPLOYE as matricule,
  substr(D.ID_EMPLOYE,1,5)as ID,
  to_char (B.DTJ_DEB,'YYYYMMDD'),
  to_char (B.DTJ_FIN,'YYYYMMDD'),
  substr(C.VALEUR_CARACTERE,1,1),
 (to_char (D.DTJ_VALORISATION,'YYYYMMDD'))
FROM
  EMP_EMPLOYES A,
  EMP_PERIODES B,
  DIC_VALEURS_CHP_HISTOS_SYNTHES C,
  CPT_VALEURS_YYYYXX1 D
WHERE
    (   A.ID_EMPLOYE = B.ID_EMPLOYE 
    AND A.ID_EMPLOYE = C.ID_ENTITE_FONCTIONNELLE(+)
    AND A.ID_EMPLOYE = D.ID_EMPLOYE
    AND
        D.DTJ_VALORISATION in (#DATE_FIN_ANNEE_1#,
				#DATE_FIN_ANNEE_2#)
    AND D.DTJ_VALORISATION between B.DTJ_DEB and B.DTJ_FIN
    AND D.DTJ_VALORISATION between C.DTJ_DEB and C.DTJ_FIN
    AND 
         A.MATRICULE_EMPLOYE BETWEEN '01' AND '51'
    AND 
        C.ID_CHAMP_PERSO  =  'H30'
    AND  A.ID_EMPLOYE  in 
     (
     SELECT
       ID_ENTITE_FONCTIONNELLE
       FROM
       DIC_VALEURS_CHP_HISTOS_SYNTHES
       WHERE
           ID_CHAMP_PERSO   =  'J10'
       AND VALEUR_CARACTERE =  '0'
     ) 
    )
)
ORDER BY matricule;


lorsque je remplace :
#DATE_DEBUT# par '1-1-2006'
#DATE_FIN# par '31-12-2008'
#DATE_FIN_ANNEE_1# par '31-12-2006'
#DATE_FIN_ANNEE_2# par '31-12-2007'

Cette requète met environ 2 min ... ( je trouve le temps pas mal et il me convient)
mais ces valeur ne doivent pas êtres écrite ainsi " en dur" elle doivent etre recherché dans une table de 1 seule ligne

mais quand je remplace :
#DATE_DEBUT# par (SELECT Date_debut FROM periodeTmp)
#DATE_FIN# par (SELECT Date_fin FROM periodeTmp)
#DATE_FIN_ANNEE_1# par (SELECT Date_fin_annee_1 FROM periodeTmp)
#DATE_FIN_ANNEE_2# par (SELECT Date_fin_annee_2 FROM periodeTmp)

Ces sous requètes ne sont pa liées,la vitesse d exécution de cette nouvelle requete devrait être quasiment la même que la précédente
or ce n'est pa du tout le cas : il met environ 2 h a sexécuter mais donne bien le bon résultat.

je ne pense pas que ce soit une erreur de format. ( ils sont tous format DATE)

a quoi est dut cette différence ?


Merci d'avance
A voir également:

1 réponse

Bonjour
Ta table periodeTmp contient combien de ligne ?
Si tu en as plusieurs, tu as autant de critères que 4 puissance ton nombre de ligne (pour chaque valeur de date_debut tu as nombre ligne possibilité pour date_fin, date_fin_annee_1 et datefin_annee_2).
0