我可以在oracle中从月到日更改范围间隔分区吗

Puj*_*haw 3 oracle database-partitioning

我有一个表,其分区如下并具有数百万行数据。表大小为 120 GB。

PARTITION BY RANGE (Read_time) INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))
Run Code Online (Sandbox Code Playgroud)

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

 PARTITION BY RANGE (Read_time) INTERVAL(NUMTODSINTERVAL(1, 'DAY'))
Run Code Online (Sandbox Code Playgroud)

我有 12 个月的分区(2018 年 10 月到 2019 年 11 月)。我希望将分区转换为日间分区。

在此输入图像描述 例如:对于 Jul'19 分区,应将其拆分为 01 Jul'19, 02 Jul'19 ....... 31 Jul'19。

数据也应该移动到新分区

我尝试过分割分区。新分区已按天创建,但行未移动到新分区。

在此输入图像描述

在此输入图像描述

Mar*_*ber 6

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

 ALTER TABLE test SET INTERVAL (NUMTODSINTERVAL(1,'DAY'));
Run Code Online (Sandbox Code Playgroud)

请参阅文档了解更多详细信息

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

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;
Run Code Online (Sandbox Code Playgroud)

每月间隔中的表已分区并包含 100 天的数据 - 产生一个初始分区和 4 个新的每月分区。

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
Run Code Online (Sandbox Code Playgroud)

现在我们切换到每日分区

 ALTER TABLE test SET INTERVAL (NUMTODSINTERVAL(1,'DAY'));
Run Code Online (Sandbox Code Playgroud)

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

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

让我们插入一些新的日子

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
Run Code Online (Sandbox Code Playgroud)

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

如果您还需要重新分区历史数据,则需要使用split partition.

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'));
Run Code Online (Sandbox Code Playgroud)

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

在此步骤之后,历史数据也会按天进行分区:

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

DT                 
-------------------
26.02.2019 00:00:00
Run Code Online (Sandbox Code Playgroud)