3

PL/SQL ストアド プロシージャを介して制御されるデータ ロードを高速化しようとしています。更新するテーブルのインデックスを使用できないようにプログラムで変更しました。私は、Oracle がこれらの使用できないインデックスを無視することを望んでいます。私は声明を出すことができます:

ALTER SESSION SET skip_unusable_indexes = TRUE

しかし、その後エラーが発生します:

ORA-01502: 索引'MY_INDEX_NAME'またはそのような索引のパーティションは使用できない状態です

私の変更セッションを無視したようです。

PL/SQLパッケージ内でセッションを変更できますか? そうでない場合、私の代替手段は何ですか? ロードを高速化するためにインデックスを無効にする (使用不可に設定する) 他にどのようにすればよいでしょうか?

やや関連する質問here

4

1 に答える 1

4

ストアドプロシージャが使用しているのと同じセッションでALTERSESSIONステートメントを発行していますか?または、そのALTER SESSIONは別のセッションで実行されますか?

動的SQLを使用してPL/SQLにALTERSESSIONを埋め込むことができます。

BEGIN
  EXECUTE IMMEDIATE 'ALTER SESSION SET skip_unusable_indexes = TRUE';

  <<more code>>
END;

一部のインデックスは一意ですか(または一意の制約を適用するために使用されますか)?skip_unusable_indexesのドキュメントに記載されているように

注:インデックスを使用してテーブルにUNIQUE制約を適用する場合、テーブルで挿入および更新操作を許可すると、制約に違反する可能性があります。したがって、この設定では、一意の使用できないインデックスのエラーレポートは無効になりません。

その場合、制約を無効にしたり、インデックスを非一意に変更したりできますか?

一意のインデックスと一意でないインデックスの違いの簡単なサンプル。使用できない一意のインデックスがある場合、skip_unusable_indexesは、使用できない一意でないインデックスがある場合のように、ORA-01502エラーを抑制しないことに注意してください。

SQL> create table a (
  2    col1 number
  3  );

Table created.

SQL> create unique index idx_a on a( col1 );

Index created.

SQL> insert into a values( 1 );

1 row created.

SQL> commit;

Commit complete.

SQL> alter index idx_a unusable;

Index altered.

SQL> insert into a values( 2 );
insert into a values( 2 )
*
ERROR at line 1:
ORA-01502: index 'SCOTT.IDX_A' or partition of such index is in unusable state


SQL> alter session set skip_unusable_indexes = true;

Session altered.

SQL> insert into a values( 2 );
insert into a values( 2 )
*
ERROR at line 1:
ORA-01502: index 'SCOTT.IDX_A' or partition of such index is in unusable state


SQL> drop index idx_a;

Index dropped.

SQL> create index idx_a_nonunique on a( col1 );

Index created.

SQL> alter index idx_a_nonunique unusable;

Index altered.

SQL> insert into a values( 2 );

1 row created.
于 2008-10-09T16:19:00.953 に答える