我有一个表,该表按如下所示进行分区,并有数百万行数据。表大小为120 GB。
PARTITION BY RANGE (Read_time) INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))现在,我想用现有的数据和未来的数据来改变这种分区策略。表每天按作业插入。
PARTITION BY RANGE (Read_time) INTERVAL(NUMTODSINTERVAL(1, 'DAY'))我有12个月的分区(10月18日至11月19日)。我想要分区被转换成白天。

例如:对于7月19日的分区,它应该被分割到07月19日,02年7月19日.7月31日至19日。
数据也应该移动到新的分区中。
我试过分割分区。新分区按日创建,但行没有移动到新分区。


发布于 2019-11-20 16:10:54
将每月间隔改为每天很简单,如
ALTER TABLE test SET INTERVAL (NUMTODSINTERVAL(1,'DAY'));有关更多细节,请参见文档
让我们在一个小例子中进行说明。
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;该表在每月内分区,并包含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现在我们切换到日常分区。
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月份开始,数据每天都进行分区。
如果你也需要重新划分你的历史数据,这将需要重组(数据移动-将需要一段时间120 If )使用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'));这将在一个新分区中分割最后一天,您将不得不在每个月分区中的每一天都这样做。
在此步骤之后,还每天对历史数据进行分区:
select * from test partition for ( DATE'2019-02-26');
DT
-------------------
26.02.2019 00:00:00https://stackoverflow.com/questions/58958190
复制相似问题