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 : 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));
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 : 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)
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 : 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));
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 : 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