Désactiver et plus tard activer tous les index de table dans Oracle
8 réponses
Voici rendre les index inutilisables sans le fichier:
DECLARE
CURSOR usr_idxs IS select * from user_indexes;
cur_idx usr_idxs% ROWTYPE;
v_sql VARCHAR2(1024);
BEGIN
OPEN usr_idxs;
LOOP
FETCH usr_idxs INTO cur_idx;
EXIT WHEN NOT usr_idxs%FOUND;
v_sql:= 'ALTER INDEX ' || cur_idx.index_name || ' UNUSABLE';
EXECUTE IMMEDIATE v_sql;
END LOOP;
CLOSE usr_idxs;
END;
La reconstruction serait similaire.
combiner 3 réponses ensemble: (parce qu'une instruction select n'exécute pas le DDL)
set pagesize 0
alter session set skip_unusable_indexes = true;
spool c:\temp\disable_indexes.sql
select 'alter index ' || u.index_name || ' unusable;' from user_indexes u;
spool off
@c:\temp\disable_indexes.sql
importer...
select 'alter index ' || u.index_name ||
' rebuild online;' from user_indexes u;
ceci suppose que l'importation va se produire dans la même (sqlplus) session.
Si vous appelez "imp", il s'exécutera dans une session séparée de sorte que vous aurez besoin d'utiliser "ALTER SYSTEM" au lieu de "ALTER SESSION" (et rappelez-vous de remettre le paramètre comme vous l'avez trouvé.
si vous utilisez des charges de parcours direct non parallèles, alors envisagez et comparez de ne pas laisser tomber les indices du tout, particulièrement si les indices ne couvrent qu'une minorité des colonnes. Oracle dispose d'un mécanisme pour la maintenance efficace des index sur les charges de chemin direct.
sinon, je conseillerais aussi de rendre les index inutilisables au lieu de les laisser tomber. Moins de chance de ne pas recréer accidentellement un index.
ici: http://forums.oracle.com/forums/thread.jspa?messageID=2354075
alter session set skip_unusable_indexes = true;
alter index your_index unusable;
importer...
alter index your_index rebuild [online];
Vous pouvez désactiver les contraintes dans Oracle mais pas les index. Il y a une commande pour rendre un index ununsable mais vous devez reconstruire l'index de toute façon, donc je devrais probablement juste écrire un script pour laisser tomber et reconstruire les index. Vous pouvez utiliser les index user_indexes et user_ind_columns pour obtenir tous les index d'un schéma ou utiliser dbms_metadata:
select dbms_metadata.get_ddl('INDEX', u.index_name) from user_indexes u;
Si vous êtes sur Oracle 11g, vous pouvez également vouloir vérifier dbms_index_utl.
combinant les deux réponses:
d'abord créer sql pour rendre tout index inutilisable:
alter session set skip_unusable_indexes = true;
select 'alter index ' || u.index_name || ' unusable;' from user_indexes u;
importer...
select 'alter index ' || u.index_name || ' rebuild online;' from user_indexes u;
vous devriez essayer le paramètre SKIP_INDEX_MAINTENANCE de sqlldr.