Après plusieurs test dans le topic qui se trouve dans ma signature, je suis arrivé malgré mes convictions à la conclusion que le IN est plus rapide que le EXISTS (et c'est plutôt flagrant).
Donc première optimisation, tu peux utiliser IN.
Ensuite, plutôt que de faire un curseur qui va exécuter 600 000 * 20 requêtes DELETE à la suite, je ferais plutôt un truc du genre :
DELETE maTable where USER_ID in (select id from delete_user);
En espérant que ça fait pas sauter le rollback segment.
L'intérêt du truc, c'est que tu ne va lancer que 20 requêtes, ce qui devrait être bien plus rapide.
Pour le coup du CASCADE, je suis assez froid, par expérience, c'est :
- source de rollback segment fault (parceque là tu va shooter tout le monde dans les 20 tables à la fois, ce qui multiplie un peu le nombre d'éléments supprimés dans la transaction)
- source de patatage++, genre t'oublie une condition dans ton delete, et tu te retrouves au bout de 4 heures avec une base vide
GRMPF ! Mais c'est quoi ce déterrage, et moi qui répond comme un con
(me disait bien aussi que j'avais pas vu orafrance depuis un bout de temps )