2008-09-24 7 views
16

Wie würde ich alle Indizes in einem bestimmten Schema/Datenbank in Oracle deaktivieren und später aktivieren?Deaktivieren und aktivieren Sie später alle Tabellenindizes in Oracle

Hinweis: Dies ist zu machen sqlldr schneller laufen.

+0

Könnten Sie ein wenig mehr Kontext geben? Haben Sie beispielsweise die folgenden Szenarien versucht: http: // www.remote-dba.net/teas_rem_util18.htm –

Antwort

15

ist hier macht die Indizes unbrauchbar ohne die Datei:..

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; 

Der Wiederaufbau wäre ähnlich.

+0

Könnten Sie die Neuerstellung für die Noobs – Worthy7

+0

Posts Es ist eine Weile her, aber Sie sollten in der Lage sein, einfach 'UNUSABLE' durch 'REBUILD' zu ersetzen. – jmc

2

Sie Einschränkungen in Oracle deaktivieren können aber nicht Indizes. Es gibt einen Befehl, um einen Index unbrauchbar zu machen, aber Sie müssen den Index trotzdem neu erstellen, also würde ich wahrscheinlich ein Skript schreiben, um die Indizes zu löschen und neu aufzubauen. Sie können die USER_INDEXES und user_ind_columns verwenden, um alle Indizes für ein Schema oder Verwendung DBMS_METADATA zu erhalten:

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

die Kombination der beiden Antworten:

Erste SQL erstellen, um alle Index unbrauchbar zu machen:

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

importierte ...

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

Wenn Sie nicht parallelen direkten Weg verwenden Ladevorgänge berücksichtigen und benchmarken, dass die Indizes überhaupt nicht gelöscht werden, insbesondere wenn die Indizes nur eine Minderheit der Spalten abdecken. Oracle verfügt über einen Mechanismus zur effizienten Verwaltung von Indizes für direkte Pfadlasten.

Ansonsten würde ich auch empfehlen, die Indizes unbrauchbar zu machen, anstatt sie fallen zu lassen. Geringere Wahrscheinlichkeit, dass ein Index nicht versehentlich neu erstellt wird.

5

Kombination 3 Antworten zusammen: (weil eine select-Anweisung der DDL nicht ausführen)

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 

Import Do ...

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

Hinweis dies setzt voraus, dass der Import passieren wird in derselben (sqlplus) Sitzung.
Wenn Sie anrufen „imp“ sie in einer separaten Sitzung ausgeführt werden, so dass Sie „SYSTEM ALTER“ verwenden, müssten anstelle von „ALTER SESSION“ (und erinnere mich an den Parameter wieder den Weg bringen Sie es gefunden.

2

wenn Sie auf Oracle 11g sind, können Sie auch dbms_index_utl auszuchecken

0

Sie sollten sqlldr der SKIP_INDEX_MAINTENANCE Parameter versuchen

Verwandte Themen