Injection et traitements de masse

Voici quelques astuces pour tous ce qui attrait aux traitements de masse ou à l'injection de données de forte volumétrie :

Suppressions en masse

Supprimer un grand nombre de lignes sans vouloir toucher au tablespace UNDO :

procédure PL :
DECLARE

compteur NUMBER := 0;
total NUMBER := 0;

CURSOR cur_donnees_sup IS
SELECT rowid
FROM tas
WHERE flag = 'Y'

BEGIN
FOR rec IN cur_donnees_sup LOOP
DELETE FROM tas
WHERE rowid = rec.rowid;

total := total + 1;
count := count + 1;

IF (compteur >= 1000) THEN
COMMIT;
compteur := 0;
END IF;

END LOOP;
COMMIT;
END;
/


ou bien :


begin
loop
DELETE FROM tas
WHERE flag = 'Y' and rownum <= 1000 exit when SQL%rowcount =0 
commit;
end loop;
end;
/


Une mise à jour pourra être effectuée sur le même principe via update :


begin
loop
update tamaj set col3 = trim(col2) || trim(col1), flag = 'N'
WHERE flag = 'Y' and rownum <= 1000 exit when SQL%rowcount <>

Insertions en masse

Que vous fassiez vos réplications ou injections de données via sqlloader, insert .. select, série d'insert dans script, ... ; il est bon d'éviter à oracle de faire des traitements inutiles, c'est pourquoi, index et contraintes peuvent être désactivés (sinon, voyez comment déterminer la hiérarchie des contraintes PK et FK). Voici la méthode :


Créer les script de désactivation et activation des contraintes et index :


spool query_desactiv_idx.sql;
select 'ALTER INDEX ' || index_name || 'UNUSABLE;' from user_indexes where table_name in ('tinj1', 'tinj2');
spool off;

spool query_desactiv_const.sql;
SELECT 'ALTER TABLE ' || table_name || ' DISABLE CONSTRAINT ' || constraint_name || ';'
FROM user_constraints
WHERE table_name in ('tinj1', 'tinj2');
spool off;

spool query_activ_idx.sql;
select 'ALTER INDEX ' || index_name || 'REBUILD;' from user_indexes where table_name in ('tinj1', 'tinj2');
spool off;
spool query_activ_const.sql;
SELECT 'ALTER TABLE ' || table_name || ' ENABLE CONSTRAINT ' || constraint_name || ';'
FROM user_constraints
WHERE table_name in ('tinj1', 'tinj2');
spool off;


Désactiver les index et les contraintes sur les tables considérées (si on n'a pas à gérer celle-ci) ; sous SQL*Plus :


@query_desactiv_idx.sql;
@query_desactiv_const.sql;


Effectuer l'import


oracle$>sqlldr ...

SQL>insert into ... select ...


Reconstruire les index :


@query_activ_idx.sql;


Réactiver les contraintes :


@query_activ_const.sql;



La désactivation puis réactivation des triggers est également très utile si ceux-ci sont superflus.

Voir également les exemples simples de reprises de données.




Vous n'avez pas trouver réponse à votre question ? Préciser votre recherche :

Catégories