it-swarm.com.de

Deaktivieren Sie und aktivieren Sie später alle Tabellenindizes in Oracle

Wie kann ich alle Indizes in einem bestimmten Schema/einer bestimmten Datenbank in Oracle deaktivieren und später aktivieren?

Hinweis: Dadurch wird sqlldr schneller ausgeführt.

18
oneself

Hier sind die Indizes ohne die Datei unbrauchbar:

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 Umbau wäre ähnlich.

17
jmc

kombinieren von 3 Antworten: (weil eine select-Anweisung die DDL nicht ausführt)

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

Importieren Sie ...

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

Beachten Sie, dass hier davon ausgegangen wird, dass der Import in derselben Sitzung (sqlplus) stattfindet.
Wenn Sie "imp" aufrufen, wird es in einer separaten Sitzung ausgeführt, so dass Sie "ALTER SYSTEM" anstelle von "ALTER SESSION" verwenden müssen (und denken Sie daran, den Parameter so zu speichern, wie Sie ihn gefunden haben.

6
pappes

Wenn Sie nichtparallele direkte Pfadlasten verwenden, sollten Sie die Indizes überhaupt nicht löschen, insbesondere wenn die Indizes nur eine Minderheit der Spalten abdecken. Oracle verfügt über einen Mechanismus für die effiziente Verwaltung von Indizes bei direkten Pfadlasten.

Ansonsten würde ich auch raten, die Indizes unbrauchbar zu machen, anstatt sie zu löschen. Geringere Chance, einen Index nicht versehentlich neu zu erstellen.

3
David Aldridge

Wenn Sie Oracle 11g verwenden, können Sie auch dbms_index_utl überprüfen.

2
Jason Baker

Von hier: http://forums.Oracle.com/forums/thread.jspa?messageID=2354075

alter session set skip_unusable_indexes = true;

alter index your_index unusable;

importiere ...

alter index your_index rebuild [online];

2
Dmitry Khalatov

Sie können Einschränkungen in Oracle deaktivieren, jedoch keine Indizes. Es gibt einen Befehl, um einen Index nicht mehr funktionsfähig zu machen, aber Sie müssen den Index trotzdem neu erstellen. Ich würde also wahrscheinlich nur ein Skript schreiben, um die Indizes zu löschen und neu zu erstellen. Sie können user_indexes und user_ind_columns verwenden, um alle Indizes für ein Schema abzurufen, oder dbms_metadata verwenden:

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

Die beiden Antworten kombinieren:

Erstellen Sie zuerst SQL, um den gesamten Index unbrauchbar zu machen:

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

Importieren Sie ...

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

Sie sollten den Parameter SKIP_INDEX_MAINTENANCE von sqlldr ausprobieren.

0
Karl Bartel