web-dev-qa-db-fra.com

Désactiver et activer ultérieurement tous les index de table dans Oracle

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.

18
oneself

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.

17
jmc

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.

6
pappes

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.

3
David Aldridge

Si vous utilisez Oracle 11g, vous pouvez également consulter dbms_index_utl .

2
Jason Baker

À 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];

2
Dmitry Khalatov

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;
2
Brian Deterling

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;
1
oneself

Vous devriez essayer le paramètre SKIP_INDEX_MAINTENANCE de sqlldr.

0
Karl Bartel