La suppression d'un grand nombre de données dans Oracle

Je ne suis pas une base de données de la personne, exactement, et la plupart de mes db de travail a été avec MySQL, donc pardonnez-moi si quelque chose dans cette question est incroyablement naïf.

J'ai besoin de supprimer 5,5 millions de lignes d'une table Oracle qui a près de 100 millions de lignes. J'ai tous les Id des lignes j'ai besoin de supprimer dans une table temporaire. Si c'était juste quelques milliers de lignes, je ferais ceci:

DELETE FROM table_name WHERE id IN (SELECT id FROM temp_table);
COMMIT;

Est-il quelque chose j'ai besoin d'être conscient de, et/ou faire différemment, parce que c'est de 5,5 millions de lignes? J'ai pensé à faire une boucle, quelque chose comme ceci:

DECLARE
  vCT NUMBER(38) := 0;

BEGIN
  FOR t IN (SELECT id FROM temp_table) LOOP
    DELETE FROM table_name WHERE id = t.id;
    vCT := vCT + 1;
    IF MOD(vCT,200000) = 0 THEN
      COMMIT;
    END IF;
  END LOOP;
  COMMIT;
END;

Tout d'abord, est - ce faire ce que je pense qu'il est - le dosage s'engage de 200 000 à un moment? En supposant qu'il est, je ne sais pas encore si c'est mieux pour générer de 5,5 millions de SQL, et de s'engager dans des lots de 200 000, ou d'avoir une instruction SQL et de s'engager à la fois.

Idées? Les meilleures pratiques?

MODIFIER: j'ai couru la première option, la seule instruction delete, et il n'a fallu que 2 heures pour se terminer en développement. Sur cette base, il est en attente d'être exécutés en production.

Vous devriez être en mesure d'utiliser le premier exemple de supprimer les données parce qu'il est dans un tableau.

OriginalL'auteur Sarah Mei | 2009-03-13