问题描述
嗨,汤姆,
我有一个要求,我们有一个表,该表在月内进行了范围分区,例如 [分区p1值小于 ('2016-07-01 ')] 等。
现在,我想将此范围分区更改为范围列表复合分区,其中每个范围分区将由国家/地区代码进一步细分。
目前,该表包含最近3年的数据,因此已经创建了36个分区,现在在每个分区中,我需要通过 “国家/地区代码” 创建一个子分区。
你能让我知道我该怎么做吗?
感谢和问候
Sumit
我有一个要求,我们有一个表,该表在月内进行了范围分区,例如 [分区p1值小于 ('2016-07-01 ')] 等。
现在,我想将此范围分区更改为范围列表复合分区,其中每个范围分区将由国家/地区代码进一步细分。
目前,该表包含最近3年的数据,因此已经创建了36个分区,现在在每个分区中,我需要通过 “国家/地区代码” 创建一个子分区。
你能让我知道我该怎么做吗?
感谢和问候
Sumit
专家解答
您不能将子分区添加到只有单层范围分区的表中。您可以使用dbms_redefinition以类似的方式对非分区表进行分区:
https://oracle-base.com/articles/misc/partitioning-an-existing-table
但值得一问:
您真的需要对现有数据进行细分吗?
如果答案是肯定的-为什么?
如果没有,您可以:
-使用所需的子分区创建新表
-在此新表中插入新数据
您可以通过以下方式使这对您的应用程序不可见:
-重命名现有表
-创建旧表和新表的视图,将它们合并在一起
-将触发器添加到将行放置在正确表中的视图中。
如果您有一个滚动的三年窗口,则可以从旧表中删除分区。三年后,它将是空的。然后您可以再次恢复为直接使用该表。
如果必须对现有数据进行细分,则还有另一种方法。
-创建新的分区表。只有一个默认的子分区。
-创建两个临时表-一个普通表,一个与新表中的子分区具有相同的分区键。这里只有一个分区
-使用分区交换的过程来传输数据:
1.将旧表交换为未分区表
2.将未分区表交换为列表分区表
3.交换列表分区表到新的子分区表
对旧表中的其余分区重复。
完成后,您需要在新表中拆分子分区。
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




