首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以在oracle中逐月更改范围间隔分区吗?

我可以在oracle中逐月更改范围间隔分区吗?
EN

Stack Overflow用户
提问于 2019-11-20 15:41:15
回答 1查看 4.8K关注 0票数 2

我有一个表,该表按如下所示进行分区,并有数百万行数据。表大小为120 GB。

代码语言:javascript
复制
PARTITION BY RANGE (Read_time) INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))

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

代码语言:javascript
复制
 PARTITION BY RANGE (Read_time) INTERVAL(NUMTODSINTERVAL(1, 'DAY'))

我有12个月的分区(10月18日至11月19日)。我想要分区被转换成白天。

例如:对于7月19日的分区,它应该被分割到07月19日,02年7月19日.7月31日至19日。

数据也应该移动到新的分区中。

我试过分割分区。新分区按日创建,但行没有移动到新分区。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-20 16:10:54

将每月间隔改为每天很简单,如

代码语言:javascript
复制
 ALTER TABLE test SET INTERVAL (NUMTODSINTERVAL(1,'DAY'));

有关更多细节,请参见文档

让我们在一个小例子中进行说明。

代码语言:javascript
复制
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个新的每月分区。

代码语言:javascript
复制
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

现在我们切换到日常分区。

代码语言:javascript
复制
 ALTER TABLE test SET INTERVAL (NUMTODSINTERVAL(1,'DAY'));

这使得现有数据(因此它是即时操作)没有任何效果,当前月份的新数据也将在当前(月份)分区中。

新月份的数据将按日划分。

让我们插入几个新的日子

代码语言:javascript
复制
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

代码语言:javascript
复制
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'));

这将在一个新分区中分割最后一天,您将不得不在每个月分区中的每一天都这样做。

在此步骤之后,还每天对历史数据进行分区:

代码语言:javascript
复制
select * from test partition for ( DATE'2019-02-26');  

DT                 
-------------------
26.02.2019 00:00:00
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58958190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档