web-dev-qa-db-ja.com

UPDATE INDEXESはローカルインデックスに対して機能しますか?

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 INDEXESEXCHANGE PARTITIONを使用するときにLOCALインデックスで機能するかどうかです。

5
psur

パーティションの維持 ドキュメントから:

オプションで、ローカルインデックスも交換するか(INCLUDING INDEXES句)、適切なマッピングについて行を検証するか(WITH VALIDATION句)を指定できます。 [...]

UPDATE INDEXESを指定しない限り、データベースは、パーティションが交換されるテーブル上のグローバルインデックスまたはすべてのグローバルインデックスパーティションをUNUSABLEとマークします。交換されるテーブルのグローバルインデックスまたはグローバルインデックスパーティションは無効のままです。

table2に一致するインデックスを作成し、INCLUDING INDEXESUPDATE INDEXESの両方を使用する必要があると思います(ただし、今はテストする方法がありません)。

5
Mat