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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de krolineeee
    Inscrit en
    Mars 2006
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 232
    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
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

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

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

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

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

  4. #4
    Membre confirmé Avatar de krolineeee
    Inscrit en
    Mars 2006
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 232
    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é 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
    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 ...

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    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

  7. #7
    Membre confirmé Avatar de krolineeee
    Inscrit en
    Mars 2006
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 232
    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 ...

  8. #8
    Membre Expert

    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
    Par défaut
    Citation Envoyé par Fred_D
    NOT EXISTS

  9. #9
    Membre confirmé Avatar de krolineeee
    Inscrit en
    Mars 2006
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 232
    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...

  10. #10
    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
    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

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    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

  12. #12
    Membre confirmé Avatar de krolineeee
    Inscrit en
    Mars 2006
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 232
    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...

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

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