Bonjour,
je cherche à optimiser une requête qui supprime de nombreux enregistrements selectionnés par un left outer join (oracle 9); la requête est la suivante:
volumétrie:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 DELETE FROM TABLE1 WHERE CHAMP IN ( SELECT T1.CHAMP FROM TABLE2 T2, TABLE1 T1 WHERE T1.CHAMP <> 0 AND T2.CHAMP (+) = T1.CHAMP AND T2.CHAMP IS NULL AND NOT EXISTS (SELECT CHAMP FROM TABLE3 T3 WHERE T1.CHAMP=T3.CHAMP));
TABLE1: 1079939
TABLE2: 1294241
TABLE3: 79
nombre d'enregistrements à supprimer: 40000
J'ai déjà essayé de remplacé le "in" par un "exists":
C'est encore plus long et aucun enregistrement n'est supprimé; je suppose que exists ne fait pas bon ménage avec la jointure.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 DELETE FROM TABLE1 T1 WHERE EXISTS( SELECT T1.CHAMP FROM TABLE2 T2 WHERE T2.CHAMP (+) = T1.CHAMP AND T1.CHAMP <> 0 AND T2.CHAMP IS NULL AND NOT EXISTS (SELECT CHAMP FROM TABLE3 T3 WHERE T1.CHAMP=T3.CHAMP)
J'ai essayé de remplacer la jointure externe par un "not exists" mais ça reste un peu plus long que la 1ère requête. Ex:
Je pense que c'est le fait de supprimer les éléments avec un IN qui ralentit l'exécution mais je n'arrive pas à concilier la jointure externe directement avec le delete...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 DELETE from TABLE1 T1 WHERE T1.TCHAMP <> 0 AND NOT EXISTS ( SELECT CHAMP FROM TABLE2 T2 WHERE T2.CHAMP = T.CHAMP) AND NOT EXISTS ( SELECT CHAMP FROM TABLE3 T3 WHERE T.CHAMP=T3.CHAMP));
Par exemple cette requête ne passe pas sur oracle 9:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 DELETE FROM TABLE1 T1 LEFT OUTER JOIN TABLE2 T2 ON T2.CHAMP = T1.CHAMP WHERE T1.CHAMP <> 0 AND T2.CHAMP IS NULL AND NOT EXISTS (SELECT CHAMP FROM TABLE3 T3 WHERE T1.CHAMP=T3.CHAMP)
Une idée?
Merci
Partager