*SQL* j'ai une requête SQL à optimiser

manuhard

Habitué
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>
 

Ayuget

Expert
le NOT IN(SELECT....) c'est (apparament) pas du tout une bonne solution.
cf les réponses de gens beaucoup plus compétents que moi en SGBD:
 

cisco

Habitué
e NOT IN(SELECT....) c'est (apparament) pas du tout une bonne solution.

Effectivement le NOT IN est a remplacer par un equivalent avec MINUS
Note que le IN lui n'a pas de pb de performance

ca donne donc a peut près (pour avoir adhe_no_bull)
[fixed]
SELECT DISTINCT
adhe_no_bull
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)
)
MINUS
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)
)
[/fixed]

Une fois que adhe_no_bull est recupéré, tu peut faire une requete avec le IN

select *
from *
where adhe_no_bull in
(
la requete précedente
)
 

manuhard

Habitué
merci pour vos réponses. Je vais tester les temps d'exécution, et voir les plans d'exécution, et vous tenir au courant.
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 126
Messages
6 717 805
Membres
1 586 365
Dernier membre
matiOs1
Partager cette page
Haut