Oracleの特定のスキーマ/データベースのすべてのインデックスを無効にし、後で有効にするにはどうすればよいですか?
注:これは、sqlldrの実行を高速化するためです。
ファイルなしではインデックスを使用できなくなります。
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;
再構築は似ています。
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」を使用する必要があります(また、パラメーターを元の状態に戻すことを忘れないでください。
非並列直接パスロードを使用している場合、特にインデックスが少数の列のみをカバーしている場合は、インデックスをまったく削除しないことを考慮し、ベンチマークしてください。 Oracleには、ダイレクトパスロードのインデックスを効率的にメンテナンスするメカニズムがあります。
それ以外の場合は、インデックスを削除する代わりに、インデックスを使用不可にすることもお勧めします。インデックスを誤って再作成しない可能性が低くなります。
Oracle 11gを使用している場合は、 dbms_index_utl も確認してください。
ここから: 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];
Oracleでは制約を無効にできますが、インデックスは無効にできません。インデックスを使用できないようにするコマンドがありますが、とにかくインデックスを再構築する必要があるため、おそらくインデックスを削除して再構築するスクリプトを書くだけです。 user_indexesおよびuser_ind_columnsを使用して、スキーマのすべてのインデックスを取得するか、dbms_metadataを使用できます。
select dbms_metadata.get_ddl('INDEX', u.index_name) from user_indexes u;
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;
Sqlldr SKIP_INDEX_MAINTENANCEパラメーターを試す必要があります。