INTERVAL分区是Oracle11g新增的特性,这种范围分区不需要定义MAXVALUE,Oracle会根据分区定义的INTERVAL来动态的分配新分区来容纳超过范围的数据。
Oracle在分配新分区的时候只会给存在数据的分区进行分配,对于不存在数据的分区并不会马上分配,而是在需要的时候才去分配。
对于这个分区分配策略,是在无意中发现的:
SQL> CREATE TABLE T_INTERVAL_PART 2 PARTITION BY RANGE (CREATED) 3 INTERVAL (NUMTOYMINTERVAL(1, 'MONTH')) 4 (PARTITION P1 VALUES LESS THAN (TO_DATE('2007-9-1', 'YYYY-MM-DD'))) 5 AS SELECT * FROM DBA_OBJECTS; 表已创建。 SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE FROM USER_TAB_PARTITIONS 2 WHERE TABLE_NAME = 'T_INTERVAL_PART' 3 ORDER BY 2; TABLE_NAME PARTITION_NAME HIGH_VALUE --------------- -------------- --------------------------------------------------------------------- T_INTERVAL_PART P1 TO_DATE(' 2007-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GR T_INTERVAL_PART SYS_P113 TO_DATE(' 2007-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALEND T_INTERVAL_PART SYS_P114 TO_DATE(' 2007-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALEND
复制
上面这个例子就是在介绍INTERVAL分区时使用的例子,不过这个例子中存在一个比较奇怪的显现,那就是对于2007年11月的分区对于的分区名称中的序号反而小于2007年10月的。
看到这个现象,第一个反应就是认为,Oracle根据INTERVAL的值的上限,从高到低依次创建分区,但是随后的测试发现并非如此:
SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE FROM USER_TAB_PARTITIONS 2 WHERE TABLE_NAME = 'T_INTERVAL_PART' 3 ORDER BY 2; TABLE_NAME PARTITION_NAME HIGH_VALUE --------------- -------------- --------------------------------------------------------------------- T_INTERVAL_PART P1 TO_DATE(' 2007-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GR T_INTERVAL_PART SYS_P113 TO_DATE(' 2007-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALEND T_INTERVAL_PART SYS_P114 TO_DATE(' 2007-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALEND T_INTERVAL_PART SYS_P115 TO_DATE(' 2008-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALEND
复制
Oracle并没有创建从07年12月到08年12月之间的所有的分区,而是仅仅创建了08年12月份的分区。这说明Oracle会根据插入数据的分区键值来分配所需的分区,中间没有包含数据的分区不会被创建。
同时也解释了为什么07年11月分区的分区序号小于10月份的,这是由于在建立分区表并插入数据的过程中,首先出现了11月份的记录,而后才出现了10月份的。
下面验证一下这个结论:
SQL> SELECT * FROM (SELECT ROWNUM RN, OWNER, OBJECT_NAME, CREATED FROM DBA_OBJECTS) 2 WHERE CREATED >= TO_DATE('2007-10-1', 'YYYY-MM-DD') 3 AND ROWNUM = 1; RN OWNER OBJECT_NAME CREATED ---------- ------------------------------ ------------------------------ ------------------- 68234 YANGTK T_INTERVAL_PART 2007-10-21 02:16:06 SQL> SELECT * FROM (SELECT ROWNUM RN, OWNER, OBJECT_NAME, CREATED FROM DBA_OBJECTS) 2 WHERE CREATED >= TO_DATE('2007-9-1', 'YYYY-MM-DD') 3 AND CREATED < TO_DATE('2007-10-1', 'YYYY-MM-DD') 4 AND ROWNUM = 1; RN OWNER OBJECT_NAME CREATED ---------- ------------------------------ ------------------------------ ------------------- 68240 SYS T_PART 2007-09-15 16:25:15
复制
由于查询DBA_OBJECTS视图的时候,先查询到创建时间为10月21日的记录,因此,INTERVAL分区表先建立了上限为11月1日的分区,随后建立了上限为10月1日的分区。
SQL> ROLLBACK; 回退已完成。 SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE FROM USER_TAB_PARTITIONS 2 WHERE TABLE_NAME = 'T_INTERVAL_PART' 3 ORDER BY 2; TABLE_NAME PARTITION_NAME HIGH_VALUE --------------- -------------- --------------------------------------------------------------------- T_INTERVAL_PART P1 TO_DATE(' 2007-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GR T_INTERVAL_PART SYS_P113 TO_DATE(' 2007-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALEND T_INTERVAL_PART SYS_P114 TO_DATE(' 2007-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALEND T_INTERVAL_PART SYS_P115 TO_DATE(' 2008-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALEND
复制
而且,即使触发Oracle分配新的分区的数据被回滚了,新增分区也不会被删除。从这一点可以推断,INTERVAL分区的分区分配采用的是自治事务。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
文章被以下合辑收录
评论
相关阅读
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
647次阅读
2025-04-18 14:18:38
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
624次阅读
2025-04-15 17:24:06
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
524次阅读
2025-04-20 10:07:02
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
521次阅读
2025-04-08 09:12:48
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
479次阅读
2025-04-22 00:20:37
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
470次阅读
2025-04-17 17:02:24
Oracle 19c RAC更换IP实战,运维必看!
szrsu
455次阅读
2025-04-08 23:57:08
一页概览:Oracle GoldenGate
甲骨文云技术
454次阅读
2025-04-30 12:17:56
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
449次阅读
2025-04-22 00:13:51
火焰图--分析复杂SQL执行计划的利器
听见风的声音
400次阅读
2025-04-17 09:30:30