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

Oracle Discussion :

Optimisation de requête


Sujet :

Oracle

  1. #1
    Membre habitué Avatar de krolineeee
    Inscrit en
    Mars 2006
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 232
    Points : 173
    Points
    173
    Par défaut Optimisation de requête
    Bonjour, j'aimerai savoir si existe une autre methode que le "not in" pour exclure certaines données.

    Pour le moment ma requête est comme ceci, mais le Not in consomme beaucoup trop de ressource :
    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
     
    SELECT 'B' AS TYPE, 
               'Total des RAL non définis' AS NOM, 
               '' AS LIB, 
               COUNT(PCH_CODE) TOTAL 
      FROM PCH 
     WHERE PCH_ETAT = 20 
         AND TRUNC(PCH_DATE) < TRUNC(SYSDATE)  
         AND pch_code not in (SELECT PCH_CODE 
                                       FROM RAL_GRP_MAG,PCH 
                                      where RGM_GRP_CODE=0  
                                         and RGM_MAG_CODE=PCH_MAG  
                                         and pch_etat=20  
                                         and trunc(pch_date)=trunc(sysdate-1)              
                                     UNION 
                                    SELECT PCH_CODE  
                                      FROM RAL_GRP_MAG,PCH  
                                     where RGM_GRP_CODE<>0                            
                                        and RGM_MAG_CODE=PCH_MAG  
                                        and pch_etat=20  
                                        and trunc(pch_date)<trunc(sysdate))

    Merci

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    NOT EXIST

    En plus tu peux remplacer UNION par UNION ALL ce qui évite le tri

  3. #3
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    et TRUNC(PCH_DATE) < TRUNC(SYSDATE) -> pas d'index utilisé à moins de faire un index de fonction

  4. #4
    Membre habitué Avatar de krolineeee
    Inscrit en
    Mars 2006
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 232
    Points : 173
    Points
    173
    Par défaut
    Citation Envoyé par Fred_D
    et TRUNC(PCH_DATE) < TRUNC(SYSDATE) -> pas d'index utilisé à moins de faire un index de fonction
    Pardon?

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par Fred_D
    NOT EXISTS

  6. #6
    Membre confirmé Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Points : 481
    Points
    481
    Par défaut
    En créant par exmple une vue V_TMP avec ta requête dans le not in (), le meilleur reste une jointure externe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT 'B' AS TYPE, 
               'Total des RAL non définis' AS NOM, 
               '' AS LIB, 
               COUNT(PCH.PCH_CODE) TOTAL 
      FROM PCH, V_TMP
     WHERE PCH_ETAT = 20 
         AND TRUNC(PCH_DATE) < TRUNC(SYSDATE)  
         AND PCH.PCH_CODE = V_TMP.PCH_CODE(+)
         AND V_TMP.PCH_CODE is null
    Désolé pour le SQL, j'ai pas encore migré vers la norme ...

  7. #7
    Membre habitué Avatar de krolineeee
    Inscrit en
    Mars 2006
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 232
    Points : 173
    Points
    173
    Par défaut
    Citation Envoyé par Fred_D
    NOT EXIST

    En plus tu peux remplacer UNION par UNION ALL ce qui évite le tri
    Le UNION ALL m'a effectivement fait gagner quelques secondes Merci

    Seulement elle reste encore tres longue à exécuter...

  8. #8
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    As-tu essayé de remplacé l'union par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT PCH_CODE 
    FROM RAL_GRP_MAG INNER JOIN PCH ON RGM_MAG_CODE=PCH_MAG  
    where pch_etat=20  
      and ((RGM_GRP_CODE=0  and trunc(pch_date)=trunc(sysdate-1))
       or  (RGM_GRP_CODE<>0 and trunc(pch_date)<trunc(sysdate)))
    Remplacé UNION ALL par OR, je ne garantis rien, mais j'essaierais

  9. #9
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    essaye :

    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
    SELECT 'B' AS TYPE, 'Total des RAL non définis' AS nom, '' AS lib,
           COUNT (pch_code) total
      FROM pch, ral_grp_mag
     WHERE pch_etat = 20
       AND TRUNC (pch_date) < TRUNC (SYSDATE)
       AND NOT EXISTS (
    		          SELECT /*+ FIRST_ROWS */
    		                 1
    		            FROM ral_grp_mag, pch
    		           WHERE rgm_mag_code = pch_mag
    		             AND pch_code = pch_code
    		             AND pch_etat = 20
    		             AND (   (    rgm_grp_code = 0
    		                      AND TRUNC (pch_date) = TRUNC (SYSDATE - 1)
    		                     )
    		                  OR (    rgm_grp_code <> 0 
    						      AND TRUNC (pch_date) < TRUNC (SYSDATE)
    		                     )
                     		  )
    					)
    Eventuellement :
    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
    SELECT 'B' AS TYPE, 'Total des RAL non définis' AS nom, '' AS lib,
           COUNT (pch_code) total
      FROM pch, ral_grp_mag
     WHERE pch_etat = 20
       AND TRUNC (pch_date) < TRUNC (SYSDATE)
       AND rgm_mag_code = pch_mag
       AND NOT (   
       	   	   	 (
    			  rgm_grp_code = 0
    		      AND TRUNC (pch_date) = TRUNC (SYSDATE - 1)
    		      )
    		     OR 
    			 (
    			  rgm_grp_code <> 0 
    			  AND TRUNC (pch_date) < TRUNC (SYSDATE)
    		     )
                )
    là je suis moins convaincu de l'impact fonctionnel

  10. #10
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Citation Envoyé par krolineeee
    Pardon?

    si tu appliques une fonction sur la colonne et qu'elle est indexée tu ne peux pas profiter de cet index. Dans ta requête tu peux mettre un index sur pch_code si c'est pas le cas. Donne nous le plan d'exécution STP

  11. #11
    Membre habitué Avatar de krolineeee
    Inscrit en
    Mars 2006
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 232
    Points : 173
    Points
    173
    Par défaut
    Citation Envoyé par Fred_D
    essaye :

    là je suis moins convaincu de l'impact fonctionnel
    J'ai testé les 2 solus et ça ne fonctionne pas...

  12. #12
    Membre habitué Avatar de krolineeee
    Inscrit en
    Mars 2006
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 232
    Points : 173
    Points
    173
    Par défaut
    Citation Envoyé par Fred_D
    si tu appliques une fonction sur la colonne et qu'elle est indexée tu ne peux pas profiter de cet index. Dans ta requête tu peux mettre un index sur pch_code si c'est pas le cas. Donne nous le plan d'exécution STP

    PCH_DATE n'est pas indéxé par contre PCH_CODE l'est ...

  13. #13
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    et le plan d'exécution ?

  14. #14
    Membre habitué Avatar de krolineeee
    Inscrit en
    Mars 2006
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 232
    Points : 173
    Points
    173
    Par défaut
    Citation Envoyé par Fred_D
    et le plan d'exécution ?

    SELECT STATEMENT Optimizer Mode=RULE
    SORT AGGREGATE
    FILTER
    TABLE ACCESS BY INDEX ROWID PCH
    INDEX RANGE SCAN IDX_PCH_ETAT
    SORT UNIQUE
    UNION-ALL
    NESTED LOOPS
    TABLE ACCESS BY INDEX ROWID PCH
    INDEX RANGE SCAN IDX_PCH_ETAT
    INDEX UNIQUE SCAN PK_GRPMAG
    NESTED LOOPS
    TABLE ACCESS FULL RAL_GRP_MAG
    TABLE ACCESS BY INDEX ROWID PCH
    INDEX RANGE SCAN IDX_PCH_ETAT

  15. #15
    Membre habitué Avatar de krolineeee
    Inscrit en
    Mars 2006
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 232
    Points : 173
    Points
    173
    Par défaut
    J'ai trouvé une solus, je passe de 15sec à moins de 500ms avec un /*+ NO_MERGE*/

  16. #16
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    t'es en mode RULE et non CHOOSE ? t'as calculé les stats ?

  17. #17
    Membre habitué Avatar de krolineeee
    Inscrit en
    Mars 2006
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 232
    Points : 173
    Points
    173
    Par défaut
    Citation Envoyé par Fred_D
    t'es en mode RULE et non CHOOSE ? t'as calculé les stats ?
    Excuses moi mais à ce niveau, c'est un peu du chinois pour moi

  18. #18
    Membre habitué Avatar de krolineeee
    Inscrit en
    Mars 2006
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 232
    Points : 173
    Points
    173
    Par défaut
    Citation Envoyé par Fred_D
    t'es en mode RULE et non CHOOSE ? t'as calculé les stats ?
    Count Statistic
    ----- --------------

    *** Module Analysis
    1 DML statements
    14 Code lines

    *** Oracle Version Dependencies
    3 v7.1

    *** DML Analysis
    1 Implicit (SELECT INTO ) queries

    *** Built-Ins Utilized
    1 COUNT
    3 SYSDATE
    6 TRUNC

  19. #19
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075

  20. #20
    Membre habitué Avatar de krolineeee
    Inscrit en
    Mars 2006
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 232
    Points : 173
    Points
    173
    Par défaut
    Je suis sous Oracle 8 et non 9

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Access] Optimisation performance requête - Index
    Par fdraven dans le forum Access
    Réponses: 11
    Dernier message: 12/08/2005, 14h30
  2. Optimisation de requête avec Tkprof
    Par stingrayjo dans le forum Oracle
    Réponses: 3
    Dernier message: 04/07/2005, 09h50
  3. 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
  4. optimisation des requêtes
    Par yech dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 21/09/2004, 19h03
  5. Optimisation de requête
    Par olivierN dans le forum SQL
    Réponses: 10
    Dernier message: 16/12/2003, 10h09

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