Question

Comment désactiver et activer tous les index d'un schéma / d'une base de données donné dans Oracle?

Remarque: cela accélère l'exécution de sqlldr.

Était-ce utile?

La solution

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.

Autres conseils

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 fonctionnera dans une session distincte et vous devrez donc utiliser "ALTER SYSTEM". au lieu de "ALTER SESSION". (et rappelez-vous de remettre le paramètre tel que vous l'avez trouvé.

Si vous utilisez des charges de chemin direct non parallèles, envisagez de ne pas supprimer les index du tout, surtout si ces derniers 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 chances de ne pas recréer accidentellement un index.

À partir d'ici: http://forums.oracle.com/forums/ thread.jspa? messageID = 2354075

alter session set skip_unusable_indexes = true;

modifier l'index your_index inutilisable;

importer ...

modifier l'index votre_index reconstruit [en ligne];

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 juste 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;

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

Combinaison des deux réponses:

Créez d'abord 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top