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。
数据也应该移动到新分区
我尝试过分割分区。新分区已按天创建,但行未移动到新分区。
将每月间隔更改为每天很简单
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)
| 归档时间: |
|
| 查看次数: |
7274 次 |
| 最近记录: |