文档解释
ORA-39296: Cannot alter index partitioning type or partitioning columns.
Cause: DBMS_METADATA_DIFF was comparing two indexes with incompatible partitioning: (1) one is partitioned and one is not (2) both are partitioned but in different ways (locally vs. globally, hash vs. range) (3) both are partitioned but on different columns. There is no SQL ALTER statement to change the way an index is partitioned.
Action: The difference cannot be eliminated with an SQL ALTER statement.
ORA-39296:不能更改索引分片类型或分片列。
错误说明
ORA-39296是一个非正常操作的错误,当一个用户尝试更改索引分分段类型或分段列时,该错误会出现。为了更好地满足负载平衡,索引拆分一般会被Oracle引擎自动实施,然而,分段索引和分段列是彼此联系到一起的,所以在Oracle中,你不能独立地更改某一个索引的分区类型或者分区列。
常见案例
下面是产生这个错误的一个常见例子:
假设给出下面这个索引:
CREATE INDEX test_index ON t1(col1)
PARTITION BY RANGE(col1)
(
PARTITION p1 VALUES LESS THAN (100)
);
如果一个用户尝试更改这个索引的分区类型,可能会导致ORA-39296的错误:
ALTER INDEX test_index REBUILD
PARTITION BY LIST (col1)
(
PARTITION p1 VALUES (100)
);
解决方法
要解决ORA-39296的错误,首先必须确定索引的分区列。通常,这和索引的列是一致的,因为这才是有效的索引结构,因此,索引的列是少不了的。
当分区列已经确定后,可以更新索引的分区类型,然后重新对索引进行组织:
ALTER INDEX test_index REBUILD
PARTITION BY LIST (col1)
(
PARTITION p1 VALUES (100)
);
ORGANIZE INDEX test_index
REBUILD;
此外,用户也可以使用DROP_PARTITION或DELETE_PARTITION这个命令,以便将某个索引下某个分区删除,然后重新创建该索引,更新为相应的类型:
ALTER INDEX test_index DROP_PARTITION p1;
CREATE INDEX test_index ON t1(col1)
PARTITION BY LIST(col1)
(
PARTITION p1 VALUES (100)
);
最后,用户还可以在创建索引的时候就指定具体的分区类型,从而确保分区类型是问题的正确形式:
CREATE INDEX test_index ON t1(col1)
PARTITION BY LIST (col1)
(
PARTITION p1 VALUES (100)
);