Rechercher : dans
Par :

[SQL-ORACLE] Optimisation?

Dernière réponse le 28 fév 2008 à 17:02:23 Bj0, le 5 jun 2007 à 16:09:31 
 Signaler ce message aux modérateurs

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
Configuration: Windows 2000
Internet Explorer 6.0

Meilleures réponses pour « [SQL ORACLE] Optimisation? » dans :
Oracle - Statistiques générales VoirPour générer des statistiques générales relatives à votre base de données, il suffit de lancer le script : $ORACLE_HOME/rdbms/admin/utlbstat.sql Des informations utiles sont alors affichées. Activer l’audit sur un objet Pour activer l’audit...
PL/SQL - Introduction au langage PL/SQL VoirIntroduction au langage PL/SQL Le langage PL/SQL est un langage L4G (entendez par ce terme un langage de quatrième génération), fournissant une interface procédurale au SGBD Oracle. Le langage PL/SQL intègre parfaitement le langage SQL en lui...
Oracle - Introduction au SGBD Oracle VoirIntroduction au SGBD Oracle Oracle est un SGBD (système de gestion de bases de données) édité par la société du même nom (Oracle Corporation - http://www.oracle.com), leader mondial des bases de données. La société Oracle Corporation a été créée en...
Oracle - Les séquences VoirCet article s'appuie sur la version 8.1.6 d'Oracle. Une séquence est un objet de base de données Oracle, au même titre qu'une table, une vue, etc... Autrement dit, il appartient à un utilisateur, on peut le manipuler, le modifier, à condition...

1

 TIZIRI3, le 28 fév 2008 à 17:02:23

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).

Répondre à TIZIRI3
Collection CommentÇaMarche.net