Domanda

Come disabilitare e abilitare successivamente tutti gli indici in un determinato schema / database in Oracle?

Nota: questo per rendere sqlldr più veloce.

È stato utile?

Soluzione

Ecco come rendere gli indici inutilizzabili senza il file:

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 ricostruzione sarebbe simile.

Altri suggerimenti

combinando 3 risposte insieme: (perché un'istruzione select non esegue il 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

Importa ...

select 'alter index ' || u.index_name || 
' rebuild online;' from user_indexes u;

Nota che ciò presuppone che l'importazione avverrà nella stessa sessione (sqlplus).
Se stai chiamando " imp " verrà eseguito in una sessione separata, pertanto dovrai utilizzare " ALTER SYSTEM " invece di " ALTER SESSION " (e ricorda di riportare il parametro nel modo in cui l'hai trovato.

Se si utilizzano carichi di percorso diretto non paralleli, considerare e fare un benchmark per non far cadere affatto gli indici, in particolare se gli indici coprono solo una minoranza delle colonne. Oracle ha un meccanismo per la manutenzione efficiente degli indici sui carichi con percorso diretto.

Altrimenti, consiglierei anche di rendere gli indici inutilizzabili invece di lasciarli cadere. Meno possibilità di non ricreare accidentalmente un indice.

Da qui: http://forums.oracle.com/forums/ thread.jspa? messageId = 2354075

modifica set di sessioni skip_unusable_indexes = true;

alter index your_index inutable;

importa ...

alter index your_index rebuild [online];

È possibile disabilitare i vincoli in Oracle ma non gli indici. C'è un comando per rendere un indice insostenibile ma devi comunque ricostruire l'indice, quindi probabilmente scriverei uno script per eliminare e ricostruire gli indici. Puoi usare user_indexes e user_ind_columns per ottenere tutti gli indici per uno schema o usare dbms_metadata:

select dbms_metadata.get_ddl('INDEX', u.index_name) from user_indexes u;

Se usi Oracle 11g, potresti anche voler dare un'occhiata a dbms_index_utl .

Combinando le due risposte:

Per prima cosa crea sql per rendere inutilizzabile tutto l'indice:

alter session set skip_unusable_indexes = true;
select 'alter index ' || u.index_name || ' unusable;' from user_indexes u;

Importa ...

select 'alter index ' || u.index_name || ' rebuild online;' from user_indexes u;

Dovresti provare il parametro SKIP_INDEX_MAINTENANCE di sqlldr.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top