新用户注册 用户登录
Java爱好者软件开发组推荐软件:  观看实时演示    查看详情    (2007-09-23)
 
   
首页 JAVA基础知识 JAVA高级编程 J2EE应用技术 J2ME应用技术 JAVA网络编程 JAVA与数据库 设计模式
 
    热门下载: 教程资料 | 开发工具 | 代码源码 | 视频教程 |
 
您现在的位置: JAVA爱好者 >> JAVA文章 >> JAVA与数据库 >> JAVA文章正文

了解Oracle11g的新增特性—INTERVAL分区

出处:开发者在线 Builder.com.cn 作者:开发者在… 更新时间:2007-12-10 13:07:55

 

Oracle11g有一个新增的特性INTERVAL分区,此种范围分区不需要定义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分区的分区分配采用的就是自治事务。

  • 上一个JAVA文章:

  • 下一个JAVA文章: 没有了
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    京ICP备05010995号
    关于我们 | 版权申明 | 网站地图 | 广告指南 | 友情链接 | 联系我们