Désactiver et plus tard activer tous les index de table dans Oracle

comment désactiver et plus tard activer tous les index dans un schéma/base de données donné dans Oracle?

Note: Ceci est pour faire courir sqlldr plus vite.

18
demandé sur cagcowboy 2008-09-24 22:48:01

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.

17
répondu jmc 2010-08-19 20:40:36

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é.

6
répondu 2008-09-25 22:32:05

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.

3
répondu David Aldridge 2008-09-24 20:47:32

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
répondu Dmitry Khalatov 2008-09-24 19:03:44

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;
2
répondu Brian Deterling 2008-09-24 19:13:06

Si vous êtes sur Oracle 11g, vous pouvez également vouloir vérifier dbms_index_utl.

2
répondu Jason Baker 2009-08-31 14:54:12

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;
1
répondu oneself 2008-09-24 19:27:13

vous devriez essayer le paramètre SKIP_INDEX_MAINTENANCE de sqlldr.

0
répondu Karl Bartel 2009-10-16 15:12:04