【问题标题】:Exchanging Range-Partitions with Local Indexes使用本地索引交换范围分区
【发布时间】:2017-07-12 15:54:24
【问题描述】:

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

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

选择将索引状态设为

可用

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

交换分区后对索引状态的选择使索引状态为

无法使用

我们想做在线分区交换。有什么方法可以使用像

这样的语句进行交换

更新索引

交换分区

声明?

我们尝试使用带有 UPDATE INDEXES 的 EXCHANGE 语句,但索引仍然无法使用。

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

【问题讨论】:

    标签: oracle database-partitioning database-indexes


    【解决方案1】:

    UPDATE INDEXES 仅适用于全局索引。由于您没有任何内容,因此该子句无效。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-01
      • 2014-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      相关资源
      最近更新 更多