web-dev-qa-db-ja.com

単一パーティションを切り捨てた後、その主キーのインデックスは使用できなくなり、そのパーティションへのすべての挿入/更新は失敗します

パーティションテーブルがあります:SAMPLE_PARTITIONED_TBL数値フィールド(データセット:201001 ... 201212 ..など)に基づく60パーティション(サブパーティションなし)のPERIOD_ID。このテーブルにはいくつかのローカルインデックスがありますが、問題は何らかの理由でPKインデックスにあります。別のスキーマに同じDDLがあり、そこで正常に動作します。これを解決するためにtioが何を探すのかわからない。

Informatica(ETLツール)を使用して、このテーブルにデータをロードしています。ロードする前に、パーティションテーブルを切り捨てます。

SQL> ALTER TABLE owner_name.SAMPLE_PARTITIONED_TBL 
   2 TRUNCATE PARTITION SMPL_201001 DROP STORAGE;

ロードが開始すると、次のエラーが発生します。

Message: Database errors occurred: 
ORA-01502: index 'owner_name.SAMPLE_PARTITIONED_TBL_PK' or 
partition of such index is in unusable state

インデックスのステータスを確認しています...

SQL> select STATUS from all_indexes
  2  where INDEX_NAME like 'SAMPLE_PARTITIONED_TBL_PK';

STATUS
--------
UNUSABLE

SQL> ALTER INDEX owner_name.SAMPLE_PARTITIONED_TBL_PK REBUILD;を実行すると、ローカルパーティションインデックスがSTATUS=VALID状態に戻り、読み込みを問題なく続行できます。


更新:

以下の@Matの観察に従って、PKインデックスがローカルにパーティション分割されているかどうかを確認しています。

SQL> select * from all_indexes where table_name = 'SAMPLE_PARTITIONED_TBL';

リストにSAMPLE_PARTITIONED_TBL_PKと他のインデックスが表示されます。

SQL> select * from  all_part_indexes where table_name = 'SAMPLE_PARTITIONED_TBL';

ここでは、LOCALITY='LOCAL'のすべてのインデックスが表示されています。 SAMPLE_PARTITIONED_TBL_PKが結果セットにないことを除いて、Matの観察を確認します。 :)

ありがとう。

5
Kent Pawar

予想されたとおり、パーティションに対するほとんどのDDL操作は、DDLの影響を受けるインデックスを無効にします。 ALTER TABLE docsは、関連するすべての操作についてそれを述べています。

特に truncate partition の場合:

切り捨てられるパーティションまたはサブパーティションごとに、Oracle Databaseは対応するローカル索引パーティションおよびサブパーティションも切り捨てます。それらのインデックスパーティションまたはサブパーティションがUNUSABLEとマークされている場合、データベースはそれらを切り捨て、UNUSABLEマーカーをVALIDにリセットします。

そのため、ローカルインデックスは切り捨てられ、validとマークされます。特に維持するように要求しない限り、グローバルインデックスは無効になります。 (下を参照してください。)
あなたの場合、主キーはローカルインデックスに基づいていないようです–実際にはパーティション化されていないようです。パーティション化されたインデックスでalter index ... rebuildを実行できないため、各パーティションを再構築する必要があります。したがって、無効化が予想されます。

これを行うには、UPDATE INDEXES/UPDATE GLOBAL INDEXES句をALTER TABLEステートメントに追加して、ALTERの実行中にOracleが自動的にインデックスを維持するようにします-参照 インデックスの自動更新 。ただし、いくつかの制限があります。インデックスを自動的に更新するときの考慮事項セクションを注意深くお読みください。

しかし、それが常に望ましいとは限りません。読み込み後にインデックスを再構築する方が効率的な場合があります。その場合、ロードプロセスではSKIP_UNUSABLE_INDEXESパラメータを使用できます(セッションレベルで設定できます)。 (このパラメータのデフォルトは、11gR2ではTRUEです。)

6
Mat