2008-09-24 9 views
16

Jak wyłączyć, a następnie włączyć wszystkie indeksy w danym schemacie/bazie danych w Oracle?Wyłącz i włącz wszystkie indeksy tabel w Oracle

Uwaga: aby program sqlldr działał szybciej.

+0

Czy możesz podać trochę więcej kontekstu? Na przykład, czy wypróbowałeś następujące scenariusze: http: // www.remote-dba.net/teas_rem_util18.htm –

Odpowiedz

15

Oto co indeksy bezużyteczny bez pliku:..

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; 

Przebudowa będzie podobna.

+0

Czy mógłbyś opublikować przebudowę dla noobów? – Worthy7

+0

Minęło trochę czasu, ale powinieneś być w stanie po prostu zamienić "UNUSABLE" na "REBUILD". – jmc

2

Można wyłączyć ograniczenia w Oracle, ale nie indeksów. Istnieje polecenie, aby uczynić indeks niezrozumiałym, ale mimo wszystko trzeba go odbudować, więc prawdopodobnie po prostu napiszę skrypt, by upuścić i odbudować indeksy. Można użyć user_indexes i user_ind_columns uzyskać wszystkie indeksy dla schematu lub wykorzystanie dbms_metadata:

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

łącząc dwie odpowiedzi:

najpierw utworzyć SQL, aby cały indeks bezużyteczny:

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

Dokonaj importu ...

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

Jeśli korzystasz z nieliniowej ścieżki bezpośredniej ładunki następnie rozważ i porównuj, nie pomijając indeksów, szczególnie jeśli indeksy obejmują tylko mniejszość kolumn. Oracle ma mechanizm wydajnej konserwacji indeksów na bezpośrednie obciążenia ścieżek.

W przeciwnym razie zaleciłbym uczynienie indeksów bezużytecznymi zamiast ich upuszczania. Mniejsza szansa na przypadkowe odtworzenie indeksu.

5

łączące 3 odpowiedzi ze sobą: (ponieważ SELECT nie wykona 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 

Czy import ...

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

Uwaga ta zakłada, że ​​import będzie się działo w tej samej sesji (sqlplus).
Jeśli dzwonisz „imp” będzie działać w osobnej sesji, więc trzeba by użyć „ALTER SYSTEM” zamiast „ALTER SESSION” (i pamiętać, aby umieścić parametr z powrotem tak, jak znalazł.

0

należy starać parametr SKIP_INDEX_MAINTENANCE sqlldr za