20

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

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

4

8 に答える 8

20

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

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;

再構築も同様です。

于 2010-08-19T20:40:36.493 に答える
6

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" を使用する必要があります (また、パラメーターを見つけた方法に戻すことを忘れないでください。

于 2008-09-25T22:32:05.537 に答える
4

ここから: 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];

于 2008-09-24T19:03:44.750 に答える
3

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

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

于 2008-09-24T20:47:32.333 に答える
3

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

select dbms_metadata.get_ddl('INDEX', u.index_name) from user_indexes u;
于 2008-09-24T19:13:06.320 に答える
2

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

于 2009-08-31T14:54:12.287 に答える
1

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;
于 2008-09-24T19:27:13.273 に答える