Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
773 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  requête SQL à optimiser

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

requête SQL à optimiser

n°633255
manuhard
Le bois ne rend pas les coups
Posté le 06-02-2004 à 11:25:59  profilanswer
 

Bonjour,
 
J'ai une requête SQL à optimiser.
 
Ma question porte en particulier sur les clauses IN, NOT IN, et OR, AND.
Dans quelle mesure peut-on optimiser une requête avec ces clauses ?
 
<code>
 
SELECT DISTINCT  
       adhe_no_bull,
       Cour_dat_eff,
       Cour_nom_adhes,
       cour_cod_prod,
       cour_cod_part,
       cour_cod_aven,
       DOCUMENTS.*
  FROM COURRIERS,
       DOCUMENTS,
       Adhesions
 WHERE DOCU_CODE = COUR_COD_AVEN
   AND DOCU_TYPE = COUR_COD_PROD
   AND ADHE_NO_ADHES = COUR_NO_ADHES
   AND COUR_COD_PROD = 72
   AND COUR_COD_AVEN ='INIT'
   AND adhe_dat_cpta IS NOT NULL
   AND (
      (adhe_flg_transfert=0)  
     OR (adhe_flg_transfert=1 AND adhe_cont_recep IS NOT NULL)
     )
   AND adhe_no_bull NOT IN  
       ( SELECT distinct adhe_no_bull
          FROM adhesions,
              evenements
         WHERE adhe_no_adhes = even_no_adhes
           and adhe_cod_prod = even_cod_prod
           AND adhe_cod_prod = 72
           AND (   adhe_dat_cpta IS NULL
                OR (adhe_flg_transfert = 1 AND adhe_cont_recep IS NULL)  
                OR even_dat_val IS NULL)  
              )
 
</code>

mood
Publicité
Posté le 06-02-2004 à 11:25:59  profilanswer
 

n°633273
MagicBuzz
Posté le 06-02-2004 à 11:30:48  profilanswer
 

Les distinct sont-il vraiment nécessaire ? C'est MONSTRUEUSEMENT consommateur, surtout si tu as beaucoup de lignes. Notamment celui qui est dans le NOT IN, je doute formtement qu'il serve à quoi que ce soit, si ce n'est augmenter de 30% le temps de la requête.
 
Sinon, c'est quel SGBD ? Ca pourra aider pour savoir de quelles fonctions tu dispose.


Message édité par MagicBuzz le 06-02-2004 à 11:31:42
n°633277
MagicBuzz
Posté le 06-02-2004 à 11:33:25  profilanswer
 

Deplus, préfixe le nom de tes champs. C'est illisible ta requête, on sait pas qui vient d'où, donc impossible de t'aider.
 
Pour remplacer le NOT IN, si la sous-requête fait appel à des éléments de la requête principale, alors modifie pour faire un :
 
not exists (select null from ...)
 
C'est énéormément plus rapide, ça la SGBD se contente de matcher la ligne en cours, et pas toute une série de codes.


Message édité par MagicBuzz le 06-02-2004 à 11:33:47
n°633286
MagicBuzz
Posté le 06-02-2004 à 11:35:06  profilanswer
 

En relisant, j'ai l'impression qu'en plus y'a un sérieux problème dans ton not in... Elle fait quoi ta requête ?
 
 
 
Je proposerais un truc du style :
 

Code :
  1. SELECT adhe_no_bull,
  2.        Cour_dat_eff,
  3.        Cour_nom_adhes,
  4.        cour_cod_prod,
  5.        cour_cod_part,
  6.        cour_cod_aven,
  7.        DOCUMENTS.*
  8.   FROM COURRIERS,
  9.        DOCUMENTS,
  10.        Adhesions
  11. WHERE DOCU_CODE = COUR_COD_AVEN
  12.    AND DOCU_TYPE = COUR_COD_PROD
  13.    AND ADHE_NO_ADHES = COUR_NO_ADHES
  14.    AND COUR_COD_PROD = 72
  15.    AND COUR_COD_AVEN ='INIT'
  16.    AND adhe_dat_cpta IS NOT NULL
  17.    AND (
  18.       (adhe_flg_transfert=0) 
  19.      OR (adhe_flg_transfert=1 AND adhe_cont_recep IS NOT NULL)
  20.      )
  21.    AND not exists (select null from evenements
  22.          WHERE even_no_adhes = adhe_no_adhes
  23.            and even_cod_prod = adhe_cod_prod
  24.            and even_dat_val IS NULL)


 
Je suis pas sûr du tout que ça marche, mais y'a moins d'ébérations déjà.


Message édité par MagicBuzz le 06-02-2004 à 11:41:36
n°633355
manuhard
Le bois ne rend pas les coups
Posté le 06-02-2004 à 11:49:35  profilanswer
 

je suis sous oracle 8i.
 
merci beaucoup. Je vais essayer ta requête, appliquer tes recommandations, et voir si ça améliore les perfs.


Message édité par manuhard le 06-02-2004 à 11:50:20

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  requête SQL à optimiser

 

Sujets relatifs
[PHP-MySQL] fonction rechercher en PHP dans la base SQLFPDF : je n'arrive pas à afficher le résultat de ma requête [résolu]
optimisation d'une requete sql!Requete SQL qui ne fonctionne pas
Mauvaise requete MySQL[PHP] comment tester si une requête ne donne pas de résultat
besoin d'infos pour requete SQL particuliere ![résolu] aide sur une requete sql toute conne
Plus de sujets relatifs à : requête SQL à optimiser


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR