Optimiser un delete sur un outer join (oracle 9)
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:
Code:
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)); |
volumétrie:
TABLE1: 1079939
TABLE2: 1294241
TABLE3: 79
nombre d'enregistrements à supprimer: 40000
J'ai déjà essayé de remplacé le "in" par un "exists":
Code:
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) |
C'est encore plus long et aucun enregistrement n'est supprimé; je suppose que exists ne fait pas bon ménage avec la jointure.
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:
Code:
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)); |
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...
Par exemple cette requête ne passe pas sur oracle 9:
Code:
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