Comment désactiver et activer tous les index d'un schéma/d'une base de données donné sous Oracle?
Remarque: Ceci est destiné à accélérer l'exécution de sqlldr.
Voici comment 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.
combinant 3 réponses ensemble: (car 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;
Notez que cela suppose que l'importation se produira dans la même session (sqlplus).
Si vous appelez "imp", il s'exécutera dans une session séparée. Vous devrez donc utiliser "ALTER SYSTEM" au lieu de "ALTER SESSION" (et n'oubliez pas de remettre le paramètre à l'état d'origine.
Si vous utilisez des chargements de chemins directs non parallèles, alors considérez et ne comparez pas du tout les index, notamment si les index ne couvrent qu'une minorité des colonnes. Oracle dispose d'un mécanisme permettant une maintenance efficace des index sur les charges de chemin directes.
Sinon, je vous conseillerais également de rendre les index inutilisables au lieu de les supprimer. Moins de chance de ne pas recréer accidentellement un index.
Si vous utilisez Oracle 11g, vous pouvez également consulter dbms_index_utl .
À partir d'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 inutilisable, mais vous devez quand même reconstruire l'index, donc j'écrirais probablement un script pour supprimer et reconstruire les index. Vous pouvez utiliser les 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;
Combinant les deux réponses:
Commencez par créer SQL pour rendre tous les index inutilisables:
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.