暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 将表的分区策略从简单索引更改为范围列表复合索引。

askTom 2016-06-21
163

问题描述

嗨,汤姆,

我有一个要求,我们有一个表,该表在月内进行了范围分区,例如 [分区p1值小于 ('2016-07-01 ')] 等。

现在,我想将此范围分区更改为范围列表复合分区,其中每个范围分区将由国家/地区代码进一步细分。

目前,该表包含最近3年的数据,因此已经创建了36个分区,现在在每个分区中,我需要通过 “国家/地区代码” 创建一个子分区。

你能让我知道我该怎么做吗?

感谢和问候
Sumit

专家解答

您不能将子分区添加到只有单层范围分区的表中。您可以使用dbms_redefinition以类似的方式对非分区表进行分区:

https://oracle-base.com/articles/misc/partitioning-an-existing-table

但值得一问:

您真的需要对现有数据进行细分吗?

如果答案是肯定的-为什么?

如果没有,您可以:

-使用所需的子分区创建新表
-在此新表中插入新数据

您可以通过以下方式使这对您的应用程序不可见:

-重命名现有表
-创建旧表和新表的视图,将它们合并在一起
-将触发器添加到将行放置在正确表中的视图中。

如果您有一个滚动的三年窗口,则可以从旧表中删除分区。三年后,它将是空的。然后您可以再次恢复为直接使用该表。

如果必须对现有数据进行细分,则还有另一种方法。

-创建新的分区表。只有一个默认的子分区。
-创建两个临时表-一个普通表,一个与新表中的子分区具有相同的分区键。这里只有一个分区
-使用分区交换的过程来传输数据:

1.将旧表交换为未分区表
2.将未分区表交换为列表分区表
3.交换列表分区表到新的子分区表

create table t (
  x date not null,
  y int not null
) partition by range (x) (
  partition p0 values less than (date'2016-01-01'),
  partition p1 values less than (date'2017-01-01'),
  partition p2 values less than (date'2018-01-01')
);

insert into t 
  select date'2015-01-01'+(rownum*10), mod(rownum, 2) from dual
  connect by level <= 100;
  
commit;

create table t_temp (
  x date not null,
  y int not null
);

create table t_list (
  x date not null,
  y int not null
) partition by list (y) (
  partition p0 values (default)
);

create table t_new (
  x date not null,
  y int not null
) partition by range (x) subpartition by list (y) 
  subpartition template (
    subpartition p0 values (default)
) (
  partition p0 values less than (date'2016-01-01'),
  partition p1 values less than (date'2017-01-01'),
  partition p2 values less than (date'2018-01-01')
);

alter table t exchange partition p0 with table t_temp;
alter table t_list exchange partition p0 with table t_temp;
alter table t_new exchange partition p0 with table t_list;

select table_name, partition_name, subpartition_name 
from user_tab_subpartitions;

TABLE_NAME                     PARTITION_ SUBPARTITI
------------------------------ ---------- ----------
T_NEW                          P0         P0_P0     
T_NEW                          P1         P1_P0     
T_NEW                          P2         P2_P0

select count(*) from t_new subpartition (p0_p0);

  COUNT(*)
----------
        36


对旧表中的其余分区重复。

完成后,您需要在新表中拆分子分区。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论