Améliorer les perf d'une procédure PL/SQL faisant un UPDATE
Bonjour,
Sur une procedure PL/SQl, j'ai un petit souci de performance (ORACLE 9i).
Voici ma requete :
Code:
1 2 3 4 5 6 7 8 9
| FOR i IN 1 .. listeParcelleRefId.count
LOOP
UPDATE ASSOCIATION a1 SET PARCELLE_REF_ID = idParcelleRefNew
WHERE a1.PARCELLE_REF_ID = listeParcelleRefId(i)
AND exists (SELECT null FROM PARCELLE p , DOSSIER d
WHERE a1.PARCELLE_ID = p.PARCELLE_ID
AND p.DOSSIER_ID = d.DOSSIER_ID
AND p.PARCELLE_PEC = 1
AND d.CAMPAGNE_ID = idNewCampagne_); |
Cet update va se faire environ 200000 fois (à la louche) ce qui entraine que la sous requete de l'update est longue.
Ce qui est embetant, c est que cette sous requete est la même quelque soit l'instant de l'update.
J'ai essayé de récupérer tous les identifiants de la table ASSOCIATION est de les stocker dans une liste :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
SELECT ASSOCIATION_ID BULK COLLECT INTO listeIdsAssociation FROM ASSOCIATION a, PARCELLE p , DOSSIER d
WHERE a.PARCELLE_ID = p.PARCELLE_ID
AND p.DOSSIER_ID = d.DOSSIER_ID
AND p.PARCELLE_PEC = 1
AND d.CAMPAGNE_ID = idNewCampagne_;
FOR i IN 1 .. listeParcelleRefId.count
LOOP
UPDATE ASSOCIATION SET PARCELLE_REF_ID = idParcelleRefNew
WHERE (listeIdsAssociation.EXISTS(ASSOCIATION_ID)) = TRUE; |
Mais cela ne marche pas, il n'aime pas listeIdsAssociation.EXISTS(ASSOCIATION_ID).
Auriez vous une petite idée vers laquelle je pourrais m'orienter pour ne pas avoir à répéter la récupérations des lignes que je dois modifier, sachant qu'elle sera toujours la meme du début à la fin du traitement.
Merci d'avance.
Vincent