【问题标题】:Can i change range interval partition from month to day in oracle我可以在oracle中逐月更改范围间隔分区吗
【发布时间】:2019-11-27 17:07:15
【问题描述】:

我有一个按如下方式分区的表,其中包含数百万行数据。表大小为 120 GB。

PARTITION BY RANGE (Read_time) INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))

现在我想使用现有数据和未来数据更改为这种分区策略。每天按作业插入表格。

 PARTITION BY RANGE (Read_time) INTERVAL(NUMTODSINTERVAL(1, 'DAY'))

我有 12 个月的分区(18 年 10 月到 19 年 11 月)。我希望将分区转换为按天计算。

例如:对于 Jul'19 分区,它应该被拆分为 2019 年 7 月 1 日, 2019 年 7 月 2 日 ………… 19 年 7 月 31 日。

数据也应该移动到新分区

我试过拆分分区。新分区已按天创建,但行没有移动到新分区。

【问题讨论】:

  • 您使用的是哪个版本的 Oracle?您目前有多少个月的分区?
  • 版本:18.1.0.095.1630
  • 我有 12 个月的分区(18 年 10 月到 19 年 11 月)。我希望将分区转换为按天计算。例如:对于 Nov'19 分区,它应该被拆分为 01 Sep'19, 02 Sep'19 .......30 Sep'19。数据也应该移动到新分区。

标签: oracle database-partitioning


【解决方案1】:

将每月间隔更改为每天很简单

 ALTER TABLE test SET INTERVAL (NUMTODSINTERVAL(1,'DAY'));

查看documentation了解更多详情

让我们用一个小例子来说明

create table test 
(dt date)
PARTITION BY RANGE (dt)
INTERVAL (NUMTOYMINTERVAL(1,'MONTH'))
(
   PARTITION part_01 values LESS THAN (TO_DATE('01-01-2019','DD-MM-YYYY'))
);

insert into test (dt)
select date'2019-01-01' + rownum dt from dual 
connect by level <= 100;

montly intrval 中的表已分区并包含 100 天的数据 - 在一个初始分区和 4 个新的 montly 分区中产生。

PARTITION_NAME                 HIGH_VALUE                                                                      
------------------------------ --------------------------------------------------------------------------------
PART_01                        TO_DATE(' 2019-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
SYS_P93334                     TO_DATE(' 2019-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
SYS_P93335                     TO_DATE(' 2019-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
SYS_P93336                     TO_DATE(' 2019-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
SYS_P93337                     TO_DATE(' 2019-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA

现在我们切换到每日分区

 ALTER TABLE test SET INTERVAL (NUMTODSINTERVAL(1,'DAY'));

对现有数据没有任何作用(所以它是即时操作),当月的新数据也将进入当前(月)分区。

新月份加载的数据将每天进行分区。

让我们插入新的几天

insert into test (dt)
select date'2019-01-01' + 100 +rownum dt from dual 
connect by level <= 22;


PARTITION_NAME                 HIGH_VALUE                                                                      
------------------------------ --------------------------------------------------------------------------------
PART_01                        TO_DATE(' 2019-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
SYS_P93334                     TO_DATE(' 2019-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
SYS_P93335                     TO_DATE(' 2019-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
SYS_P93336                     TO_DATE(' 2019-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
SYS_P93337                     TO_DATE(' 2019-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
SYS_P93338                     TO_DATE(' 2019-05-02 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
SYS_P93339                     TO_DATE(' 2019-05-03 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
SYS_P93340                     TO_DATE(' 2019-05-04 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA

正如预期的那样,从 5 月开始,数据每天进行分区。

如果您还需要重新分区您的历史数据,这将需要使用split partition 进行重组(数据移动 - 120GB 需要一些时间)。

alter table test
    SPLIT PARTITION FOR(TO_DATE('2019-02-01','yyyy-mm-dd'))
    AT (TO_DATE('2019-02-27','yyyy-mm-dd'));
alter table test
    SPLIT PARTITION FOR(TO_DATE('2019-02-01','yyyy-mm-dd'))
    AT (TO_DATE('2019-02-26','yyyy-mm-dd'));

这会将最后一天拆分为一个新分区,您必须在每个月的分区中为每一天执行此操作。

在这一步之后,历史数据也会每天分区:

select * from test partition for ( DATE'2019-02-26');  

DT                 
-------------------
26.02.2019 00:00:00

【讨论】:

  • 感谢您的解决方案。
  • 我尝试为 7 月份的历史数据分割分区。但是数据没有移动到新的拆分分区。我希望将数据移动到新分区中。
  • @PujaShaw 您将不得不提出一个新问题并正确描述您的问题 - 充其量是从一个小样本数据开始的。还要记住,拆分不会移动所有数据,而只会移动拆分日期定义的部分。 Oracle 针对没有数据匹配拆分日期的情况进行了优化——在这种情况下没有数据被移动。
猜你喜欢
  • 1970-01-01
  • 2018-10-05
  • 2017-04-14
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 2016-06-26
  • 1970-01-01
相关资源
最近更新 更多