我们的表有一个月间隔的范围分区。表中的索引(包括主键)是本地索引。
但是,当将这些表中的分区与没有分区的表交换时,本地索引就变得不可用了。在Oracle文档中,它只讨论全局索引的问题。因此,通过向索引添加分区键,我们将全局主索引转换为本地索引。
示例查询-
CREATE TABLE sourcetable
(owner varchar2(30), OBJECT_NAME VARCHAR2(100))
PARTITION BY RANGE (owner)
(PARTITION P1 VALUES LESS THAN (MAXVALUE));
CREATE TABLE DESTTABLE
(owner varchar2(30), OBJECT_NAME VARCHAR2(100));
create index sourcetable_idx
on sourcetable ( owner )
local ;
alter table sourcetable add constraint src_pk primary key ( owner );
insert into sourcetable select U.OBJECT_ID, u.object_name from user_objects u
where rownum <11;
select index_name,partition_name,status from user_ind_partitions
where index_name IN (
select index_name from user_indexes
where table_name = 'SOURCETABLE'
);选择将索引状态设为
可用
ALTER TABLE sourcetable
EXCHANGE PARTITION p1 WITH TABLE desttable;
select index_name,partition_name,status from user_ind_partitions
where index_name IN (
select index_name from user_indexes
where table_name = 'SOURCETABLE'
);交换分区后的select索引状态将索引状态设为
不可用
我们想做在线分区交换。我们是否可以使用如下语句进行交换?
更新索引
使用
交换分区
口供?
我们尝试在更新索引中使用EXCHANGE语句,但这些索引仍然无法使用。
ALTER TABLE sourcetable
EXCHANGE PARTITION p1 WITH TABLE desttable UPDATE INDEXES;发布于 2017-07-13 09:44:04
UPDATE INDEXES只适用于全局索引。既然你没有,这个条款就没有效果了。
您必须使用INCLUDING INDEXES。但是,为此您必须在源表和目标表上创建相同的索引。试试这个:
CREATE INDEX desttable_idx ON desttable ( OWNER );
ALTER TABLE sourcetable EXCHANGE PARTITION p1 WITH TABLE desttable INCLUDING INDEXES;https://stackoverflow.com/questions/45062507
复制相似问题