Bj0
Messages postés74Date d'inscriptionmercredi 25 avril 2007StatutMembreDerniè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)
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).