requête SQL à optimiser

requête SQL à optimiser - SQL/NoSQL - Programmation

Marsh Posté le 06-02-2004 à 11:25:59    

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>

Reply

Marsh Posté le 06-02-2004 à 11:25:59   

Reply

Marsh Posté le 06-02-2004 à 11:30:48    

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
Reply

Marsh Posté le 06-02-2004 à 11:33:25    

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
Reply

Marsh Posté le 06-02-2004 à 11:35:06    

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
Reply

Marsh Posté le 06-02-2004 à 11:49:35    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed