requête SQL à optimiser - SQL/NoSQL - Programmation
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.
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.
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 :
|
Je suis pas sûr du tout que ça marche, mais y'a moins d'ébérations déjà.
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.
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>