UPDATE INDEXES 是否适用于本地索引?

psu*_*sur 5 index oracle partitioning

我在 Oracle 11.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);
Run Code Online (Sandbox Code Playgroud)

第二个表类似,但没有分区和索引:

CREATE TABLE table2(col1 INT, col2 INT);
INSERT INTO table2 VALUES(1, 2);
Run Code Online (Sandbox Code Playgroud)

当我从交换分区的一个table1table2那么这个分区索引将无法使用。为了避免这种情况,我可以使用UPDATE INDEXES,所以我这样做:

ALTER TABLE table1 EXCHANGE PARTITION p1
WITH TABLE table2 WITH VALIDATION UPDATE INDEXES;
Run Code Online (Sandbox Code Playgroud)

UPDATE INDEXES似乎不起作用,因为当我检查该分区的索引状态时,它无法使用。

SELECT partition_name, status FROM user_ind_partitions
WHERE index_name = 'TABLE1_INDEX';

PARTITION_NAME                 STATUS   
------------------------------ -------- 
P1                             UNUSABLE 
P2                             USABLE 
Run Code Online (Sandbox Code Playgroud)

对于GLOBAL索引,它按预期工作。

问题是:使用时UPDATE INDEXESLOCAL索引有用EXCHANGE PARTITION吗?

Mat*_*Mat 5

维护分区文档:

您可以选择指定是否还要交换本地索引(INCLUDING INDEXES 子句),以及是否要验证行以进行正确映射(WITH VALIDATION 子句)。[...]

除非您指定 UPDATE INDEXES,否则数据库会将正在交换其分区的表上的全局索引或所有全局索引分区标记为 UNUSABLE。正在交换的表上的全局索引或全局索引分区保持无效。

我相信你需要创建一个匹配的索引并table2同时使用INCLUDING INDEXESUPDATE INDEXES(但现在没有办法测试它)。