Oracle 11.2に2つのテーブルがあります。最初はパーティション化されており、ローカルインデックス(接頭辞なし)があります。
CREATE TABLE table1 (col1 INT, col2 INT)
PARTITION BY LIST(col1)
(
PARTITION p1 VALUES(1),
PARTITION p2 VALUES(2)
);
CREATE INDEX table1_index on table1(col2) LOCAL;
INSERT INTO table1 VALUES(1, 1);
INSERT INTO table1 VALUES(2, 1);
2番目のテーブルも同様ですが、パーティションとインデックスはありません。
CREATE TABLE table2(col1 INT, col2 INT);
INSERT INTO table2 VALUES(1, 2);
table1
のパーティションの1つをtable2
と交換すると、このパーティションのインデックスが使用できなくなります。これを回避するには、UPDATE INDEXES
を使用できます。
ALTER TABLE table1 EXCHANGE PARTITION p1
WITH TABLE table2 WITH VALIDATION UPDATE INDEXES;
しかし、UPDATE INDEXES
は機能しないようです。これは、このパーティションのインデックスのステータスを確認すると使用できないためです。
SELECT partition_name, status FROM user_ind_partitions
WHERE index_name = 'TABLE1_INDEX';
PARTITION_NAME STATUS
------------------------------ --------
P1 UNUSABLE
P2 USABLE
GLOBAL
インデックスの場合、期待どおりに機能します。
問題は、UPDATE INDEXES
をEXCHANGE PARTITION
を使用するときにLOCAL
インデックスで機能するかどうかです。
パーティションの維持 ドキュメントから:
オプションで、ローカルインデックスも交換するか(INCLUDING INDEXES句)、適切なマッピングについて行を検証するか(WITH VALIDATION句)を指定できます。 [...]
UPDATE INDEXESを指定しない限り、データベースは、パーティションが交換されるテーブル上のグローバルインデックスまたはすべてのグローバルインデックスパーティションをUNUSABLEとマークします。交換されるテーブルのグローバルインデックスまたはグローバルインデックスパーティションは無効のままです。
table2
に一致するインデックスを作成し、INCLUDING INDEXES
とUPDATE INDEXES
の両方を使用する必要があると思います(ただし、今はテストする方法がありません)。