web-dev-qa-db-ja.com

Oracleのすべてのテーブルインデックスを無効にして後で有効にする

Oracleの特定のスキーマ/データベースのすべてのインデックスを無効にし、後で有効にするにはどうすればよいですか?

注:これは、sqlldrの実行を高速化するためです。

19
oneself

ファイルなしではインデックスを使用できなくなります。

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;

再構築は似ています。

18
jmc

3つの回答を組み合わせます:(selectステートメントは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

インポートを実行...

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

これは、インポートが同じ(sqlplus)セッションで行われることを前提としていることに注意してください。
「imp」を呼び出す場合、別のセッションで実行されるため、「ALTER SESSION」の代わりに「ALTER SYSTEM」を使用する必要があります(また、パラメーターを元の状態に戻すことを忘れないでください。

6
pappes

非並列直接パスロードを使用している場合、特にインデックスが少数の列のみをカバーしている場合は、インデックスをまったく削除しないことを考慮し、ベンチマークしてください。 Oracleには、ダイレクトパスロードのインデックスを効率的にメンテナンスするメカニズムがあります。

それ以外の場合は、インデックスを削除する代わりに、インデックスを使用不可にすることもお勧めします。インデックスを誤って再作成しない可能性が低くなります。

3
David Aldridge

Oracle 11gを使用している場合は、 dbms_index_utl も確認してください。

2
Jason Baker

ここから: http://forums.Oracle.com/forums/thread.jspa?messageID=2354075

alter session set skip_unusable_indexes = true;

alter index your_index unusable;

インポートを実行...

alter index your_index rebuild [online];

2
Dmitry Khalatov

Oracleでは制約を無効にできますが、インデックスは無効にできません。インデックスを使用できないようにするコマンドがありますが、とにかくインデックスを再構築する必要があるため、おそらくインデックスを削除して再構築するスクリプトを書くだけです。 user_indexesおよびuser_ind_columnsを使用して、スキーマのすべてのインデックスを取得するか、dbms_metadataを使用できます。

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

2つの答えを組み合わせる:

最初にsqlを作成して、すべてのインデックスを使用不可にします。

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

インポートを実行...

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

Sqlldr SKIP_INDEX_MAINTENANCEパラメーターを試す必要があります。

0
Karl Bartel