使用本地索引交换范围分区

时间:2017-07-12 15:54:24

标签: oracle database-partitioning database-indexes

我们有一个月间隔范围分区的表。包括主键的表上的索引是本地索引。

但是,当使用没有分区的表交换这些表中的分区时,本地索引将变为UNUSABLE。在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'
);

select将索引状态设为

  

USABLE

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'
);

交换分区后选择索引状态会将索引状态显示为

  

UNUSABLE

我们想做在线分区交换。有没有办法可以使用

这样的语句进行交换
  

更新指数

使用

  

交换分区

语句?

我们尝试将EXCHANGE语句与UPDATE INDEXES一起使用,但索引仍然不可用。

ALTER TABLE sourcetable 
EXCHANGE PARTITION p1 WITH TABLE desttable UPDATE INDEXES;

1 个答案:

答案 0 :(得分:0)

UPDATE INDEXES仅适用于全局索引。由于你没有,这个条款没有效果。

您必须使用INCLUDING INDEXES。但是,为此必须在源表和目标表上创建相同的索引。试试这个:

CREATE INDEX desttable_idx ON desttable ( OWNER );
ALTER TABLE sourcetable EXCHANGE PARTITION p1 WITH TABLE desttable INCLUDING INDEXES;