Oracle の特定のスキーマ/データベースのすべてのインデックスを無効にして後で有効にするにはどうすればよいですか?
注: これは、sqlldr の実行を高速化するためです。
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" を使用する必要があります (また、パラメーターを見つけた方法に戻すことを忘れないでください。
ここから: 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には、ダイレクトパスロードのインデックスを効率的に保守するためのメカニズムがあります。
それ以外の場合は、インデックスを削除するのではなく、使用できないようにすることもお勧めします。誤ってインデックスを再作成しない可能性が低くなります。
Oracle では制約を無効にできますが、インデックスは無効にできません。インデックスを unsable にするコマンドがありますが、とにかくインデックスを再構築する必要があるため、インデックスを削除して再構築するスクリプトを作成するだけです。user_indexes と user_ind_columns を使用して、スキーマのすべてのインデックスを取得するか、dbms_metadata を使用できます。
select dbms_metadata.get_ddl('INDEX', u.index_name) from user_indexes u;
Oracle 11g を使用している場合は、dbms_index_utlも確認してください。
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;