IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

optimisation de requête SQL


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 7
    Points : 6
    Points
    6
    Par défaut optimisation de requête SQL
    Bonjour,
    Je recherche un moyen d'optimiser cette requête qui demande plusieurs minutes pour s'exécuter.
    L'objectif est de récupérer l'occurence la plus récente dans une période donnée (ici, janvier 2007).
    d'avance merci.

    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
     select  CUF_C_UF, mat_c_agent
    from taff b
    where  
    AFF_D_DEBUT <= to_date('01/01/2007','DD/MM/YYYY')
    and AFF_D_FIN>=LAST_DAY(to_date('01/01/2007','DD/MM/YYYY'))
    and EHR_C_EH='21066'
    and AFF_D_DEBUT=
    (
        select max(c.AFF_D_DEBUT) 
        from taff c 
        where c.MAT_C_AGENT=b.MAT_C_AGENT 
        and c.AFF_D_DEBUT<=to_date('01/01/2007','DD/MM/YYYY')
    )
     
    CREATE TABLE TAFF ( 
      EHR_C_EH      CHAR (5)      NOT NULL, 
      MAT_C_AGENT   VARCHAR2 (14)  NOT NULL, 
      AFF_D_DEBUT   DATE          NOT NULL, 
      AFF_C_NATURE  CHAR (3)      NOT NULL, 
      EHR_C_EHUF    CHAR (5)      NOT NULL, 
      CUF_C_UF      VARCHAR2 (17)  NOT NULL, 
      AFF_D_APPAR   DATE          NOT NULL, 
      AFF_D_DISPAR  DATE          NOT NULL, 
      AFF_D_FIN     DATE          NOT NULL, 
      AFF_N_POINTS  NUMBER (6), 
      AFF_N_NUMER   NUMBER (6), 
      AFF_N_DENOM   NUMBER (6), 
      CONSTRAINT PK_TAFF
      PRIMARY KEY ( EHR_C_EH, MAT_C_AGENT, AFF_D_DEBUT, AFF_C_NATURE, EHR_C_EHUF, CUF_C_UF, AFF_D_APPAR ) 
        USING INDEX 
         TABLESPACE AGEINDEX PCTFREE 10
         STORAGE ( INITIAL 90232K NEXT 4632K PCTINCREASE 0 ))
       TABLESPACE AGEDATA NOLOGGING 
       PCTFREE 10
       PCTUSED 40
       INITRANS 1
       MAXTRANS 255
      STORAGE ( 
       INITIAL 78499840
       NEXT 1331200
       MINEXTENTS 1
       MAXEXTENTS 99
       FREELISTS 1 FREELIST GROUPS 1 )
       NOCACHE; 
     
    ALTER TABLE PH7.TAFF ADD  CONSTRAINT FK_TAFF_AFF_CUF_TCUF
     FOREIGN KEY (EHR_C_EH, CUF_C_UF) 
      REFERENCES PH7.TCUF (EHR_C_EH, CUF_C_UF) ;
     
    ALTER TABLE PH7.TAFF ADD  CONSTRAINT FK_TAFF_AFF_MAT_TMAT
     FOREIGN KEY (EHR_C_EHUF, MAT_C_AGENT) 
      REFERENCES PH7.TMAT (EHR_C_EH, MAT_C_AGENT) ;
     
    CREATE INDEX AFF_CUF_FK ON 
      TAFF(EHR_C_EH, CUF_C_UF) 
      TABLESPACE AGEINDEX PCTFREE 10  STORAGE(INITIAL 31744000 NEXT 4706304 PCTINCREASE 10 ) 
    ; 
     
    CREATE INDEX AFF_MAT_FK ON 
      TAFF(EHR_C_EHUF, MAT_C_AGENT) 
      TABLESPACE AGEINDEX PCTFREE 10  STORAGE(INITIAL 34816000 NEXT 4943872 PCTINCREASE 10 ) 
    ;

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Peut tu ajouter le plan d'exécution de la requête, éventuellement faire un tkprof ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    Citation Envoyé par millien Voir le message
    Bonjour,
    Je recherche un moyen d'optimiser cette requête qui demande plusieurs minutes pour s'exécuter.
    L'objectif est de récupérer l'occurence la plus récente dans une période donnée (ici, janvier 2007).
    d'avance merci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     select  CUF_C_UF, mat_c_agent
    from taff b
    where  
    AFF_D_DEBUT <= to_date('01/01/2007','DD/MM/YYYY')
    and AFF_D_FIN>=LAST_DAY(to_date('01/01/2007','DD/MM/YYYY'))
    and EHR_C_EH='21066'
    and AFF_D_DEBUT=
    (
        select max(c.AFF_D_DEBUT) 
        from taff c 
        where c.MAT_C_AGENT=b.MAT_C_AGENT 
        and c.AFF_D_DEBUT<=to_date('01/01/2007','DD/MM/YYYY')
    )
    Il y a beaucoup d'information qui manque notamment la version, le plan d'exécution, la volumetrie et si les statistiques sont collectées Certains index sont probablement à créer. Mais mon nez me dit que la requête ci-après va se comporter mieux. Elle marche à partir d'Oracle 9i et elle peut être réécrite différemment pour les versions précédentes
    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
    with t as
    (
      select mat_c_agent, max(AFF_D_DEBUT) max_aff_d_debut
      from taff
      where AFF_D_DEBUT<=to_date('01/01/2007','DD/MM/YYYY')
      group by mat_c_agent
    )
    select  CUF_C_UF, mat_c_agent
    from taff t1, t
    where  
      t1.AFF_D_DEBUT <= to_date('01/01/2007','DD/MM/YYYY')
      and t1.AFF_D_FIN>=LAST_DAY(to_date('01/01/2007','DD/MM/YYYY'))
      and t1.EHR_C_EH='21066'
      and t1.AFF_D_DEBUT= t.max_aff_d_debut
      and t1.mat_c_agent = t.mat_c_agent
    Consultant et formateur Oracle

  4. #4
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    bonjour,
    je sais que ça joue peu sur les perf, mais au lieu de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND t1.AFF_D_FIN>=LAST_DAY(to_date('01/01/2007','DD/MM/YYYY'))
    il serais plus simple de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND t1.AFF_D_FIN>=to_date('31/01/2007','DD/MM/YYYY')
    un last_day sur une valeur "en dur" c'est pas très bon...puisque la valeur calculée du last_day est connue d'avance.

    De plus le fait d'avoir une clause sur une fonction peut empêcher l'optimiseur d'utiliser un index...
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 7
    Points : 6
    Points
    6
    Par défaut merci Michel SALAIS
    Je suis passée par une table temporaire parce que je suis en version 8 d'oracle.
    Ca marche bien merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Initiation à l'optimisation de requêtes SQL sous ORACLE
    Par Vincent Rogier dans le forum Contribuez
    Réponses: 12
    Dernier message: 30/09/2011, 14h09
  2. [phpBB] Optimiser les requêtes SQL
    Par Jimalexp dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 22/09/2008, 07h33
  3. [phpBB] Optimiser les requêtes SQL
    Par Jimalexp dans le forum Langage SQL
    Réponses: 0
    Dernier message: 22/09/2008, 01h42
  4. Optimisation de requêtes SQL - utilisation de IN SELECT
    Par cfeltz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 20/12/2006, 09h28
  5. Optimiser une requête SQL d'un moteur de recherche
    Par kibodio dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/03/2005, 20h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo