【PARTITION】Oracle11g新特性之间隔分区运用说明

Oracle11g新特性之间隔分区运用说明

一、概述

间隔分区(interval partitioning)是oracle database 11g Release 1及以上版本中的新增特性,它就是以一个区间分区表为“起点”,并在定义中增加了一个规则(即间隔),使数据库知道将来如何增加分区。
    目标:当且仅当存在一个给定分区的数据而且这些数据加入数据库时才为数据创建新的分区。简单来讲,就是不需要预先为数据创建分区,而是在插入数据时让数据自己创建分区。要使用间隔分区,首先从一个没有MAXVALUE分区的区间分区表开始,指定一个要增加至上界(upper bound)的间隔(上界是最大值,如果达到这个最大值,分区表就要创建一个新的区间分区)。这个分区表要按某一列分区,而且这一列能够增加number或者interval类型的值(例如,按varchar2字段分区的分区表就不能使用间隔分区,也就是说,可以使用alter命令将现有的区间分区表修改为间隔分区,也可以使用create创建一个间隔分区。

二、 操作说明

创建一个用户,并创建间隔分区

SQL> create tablespace xysoul datafile '/oracle11g/product/11.2.0/oradata/loves/xysoul01.dbf' size 1G;

 

Tablespace created.

 

SQL> conn xysoul/xysoul

Connected.

SQL> create table audit_trail (ts timestamp,data varchar2(30))

  2  partition by range(ts)

  3  interval (numtoyminterval(1,'month'))

  4  store in (users,xysoul)

  5  (partition p0 values less than

  6  (to_date('2010-01-01','yyyy-mm-dd')));

 

Table created.

 

注意:如果按月份间隔,不能写某个月28日以后的某一天,由于2月没有31日。如果填写,报错如下:

SQL> create table audit_trail1 (ts timestamp,data varchar2(30))

  2  partition by range(ts)

  3  interval (numtoyminterval(1,'month'))

  4  store in (users,xysoul)

  5  (partition p0 values less than

  6  (to_date('2010-01-29','yyyy-mm-dd')));

create table audit_trail1 (ts timestamp,data varchar2(30))

*

ERROR at line 1:

ORA-14767: Cannot specify this interval with existing high bounds


查看数据字典,查看分区信息

SQL> select a.partition_name,a.tablespace_name,a.high_value,

  2  decode(a.interval,'YES',b.interval) invertal

  3  from user_tab_partitions a,user_part_tables b

  4  where a.table_name='AUDIT_TRAIL'

  5  and a.table_name=b.table_name

  6  order by a.partition_position;
PARTITION_NAME     TABLESPACE_NAME     HIGH_VALUE                          INVERTAL

------------------ -------------------- ----------------------------------- ----------

P0                 USERS                TIMESTAMP' 2010-01-01 00:00:00'

 

插入一条数据,并查看,发现多了一个分区

SQL> insert into audit_trail(ts,data) values

  2  (to_timestamp('2010-03-27','yyyy-mm-dd'),'xysoul');

SQL> col INVERTAL for a40

SQL> col HIGH_VALUE for a35

SQL> set lines 999

SQL> col tablespace_name for a20

SQL> col PARTITION_NAME for a15

SQL> select a.partition_name,a.tablespace_name,a.high_value,

  2  decode(a.interval,'YES',b.interval) invertal

  3  from user_tab_partitions a,user_part_tables b

  4  where a.table_name='AUDIT_TRAIL'

  5  and a.table_name=b.table_name

  6  order by a.partition_position;

 

PARTITION_NAME  TABLESPACE_NAME      HIGH_VALUE                          INVERTAL

--------------- -------------------- ----------------------------------- ----------------------------------------

P0              USERS                TIMESTAMP' 2010-01-01 00:00:00'

SYS_P61         XYSOUL               TIMESTAMP' 2010-04-01 00:00:00'     NUMTOYMINTERVAL(1,'MONTH')

 

再次插入一条数据,并查看

SQL> insert into audit_trail(ts,data) values

  2  (to_timestamp('2010-07-7','yyyy-mm-dd'),'lss');

 

1 row created.

 

SQL>

SQL> col INVERTAL for a40

SQL> col HIGH_VALUE for a35

SQL> set lines 999

SQL> col tablespace_name for a20

SQL> col PARTITION_NAME for a15

SQL> select a.partition_name,a.tablespace_name,a.high_value,

  2  decode(a.interval,'YES',b.interval) invertal

  3  from user_tab_partitions a,user_part_tables b

  4  where a.table_name='AUDIT_TRAIL'

  5  and a.table_name=b.table_name

  6  order by a.partition_position;

 

PARTITION_NAME  TABLESPACE_NAME      HIGH_VALUE                          INVERTAL

--------------- -------------------- ----------------------------------- ----------------------------------------

P0              USERS                TIMESTAMP' 2010-01-01 00:00:00'

SYS_P61         XYSOUL               TIMESTAMP' 2010-04-01 00:00:00'     NUMTOYMINTERVAL(1,'MONTH')

SYS_P62         XYSOUL               TIMESTAMP' 2010-08-01 00:00:00'     NUMTOYMINTERVAL(1,'MONTH')


我们发现,现在使用的表空间都为XYSOUL,再次插入两条数据,看一下

SQL> insert into audit_trail(ts,data) values

  2  (to_timestamp('2010-02-22','yyyy-mm-dd'),'lss');

 

1 row created.

 

SQL> col INVERTAL for a40

SQL> col HIGH_VALUE for a35

SQL> set lines 999

SQL> col tablespace_name for a20

SQL> col PARTITION_NAME for a15

SQL> select a.partition_name,a.tablespace_name,a.high_value,

  2  decode(a.interval,'YES',b.interval) invertal

  3  from user_tab_partitions a,user_part_tables b

  4  where a.table_name='AUDIT_TRAIL'

  5  and a.table_name=b.table_name

  6  order by a.partition_position;

 

PARTITION_NAME  TABLESPACE_NAME      HIGH_VALUE                          INVERTAL

--------------- -------------------- ----------------------------------- ----------------------------------------

P0              USERS                TIMESTAMP' 2010-01-01 00:00:00'

SYS_P64         USERS                TIMESTAMP' 2010-03-01 00:00:00'     NUMTOYMINTERVAL(1,'MONTH')

SYS_P61         XYSOUL               TIMESTAMP' 2010-04-01 00:00:00'     NUMTOYMINTERVAL(1,'MONTH')

SYS_P63         XYSOUL               TIMESTAMP' 2010-06-01 00:00:00'     NUMTOYMINTERVAL(1,'MONTH')

SYS_P62         XYSOUL               TIMESTAMP' 2010-08-01 00:00:00'     NUMTOYMINTERVAL(1,'MONTH')

 

就像我们看到的,偶数(按月份)分区存放于表空间XYSOUL,奇数分区存放于表空间USERS中。

查看表中数据,并执行回滚操作,再次查看表及分区信息


SQL> select * from audit_trail;

 

TS                                  DATA

----------------------------------- -----------

22-FEB-10 12.00.00.000000 AM        lss

27-MAR-10 12.00.00.000000 AM        xysoul

12-MAY-10 12.00.00.000000 AM        lss

07-JUL-10 12.00.00.000000 AM        lss

SQL> rollback;

 

Rollback complete.

 

SQL> select * from audit_trail;

 

no rows selected

 

SQL> col INVERTAL for a40

SQL> col HIGH_VALUE for a35

SQL> set lines 999

SQL> col tablespace_name for a20

SQL> col PARTITION_NAME for a15

SQL> select a.partition_name,a.tablespace_name,a.high_value,

  2  decode(a.interval,'YES',b.interval) invertal

  3  from user_tab_partitions a,user_part_tables b

  4  where a.table_name='AUDIT_TRAIL'

  5  and a.table_name=b.table_name

  6  order by a.partition_position;

 

PARTITION_NAME  TABLESPACE_NAME      HIGH_VALUE                          INVERTAL

--------------- -------------------- ----------------------------------- ----------------------------------------

P0              USERS                TIMESTAMP' 2010-01-01 00:00:00'

SYS_P64         USERS                TIMESTAMP' 2010-03-01 00:00:00'     NUMTOYMINTERVAL(1,'MONTH')

SYS_P61         XYSOUL               TIMESTAMP' 2010-04-01 00:00:00'     NUMTOYMINTERVAL(1,'MONTH')

SYS_P63         XYSOUL               TIMESTAMP' 2010-06-01 00:00:00'     NUMTOYMINTERVAL(1,'MONTH')

SYS_P62         XYSOUL               TIMESTAMP' 2010-08-01 00:00:00'     NUMTOYMINTERVAL(1,'MONTH')

 

看以上信息得知,执行回滚后,表中数据消失,而分区还在。由于这些分区使用一个递归事务(recursive transaction)来创建,递归事务是从正在执行的事务之外单独执行的事务。插入数据行时,数据库发现我们需要的分区尚不存在,就会立即开始一个新的事务,更新数据字典来反映这个新分区的存在,并提交所做工作。它必须这样做,否则存在多个插入会出现严重的竞争(串行化),因为其他事务必须等待我们提交才能看到这个新分区。因此,这个DDL是在现有事务之外完成的,所以分区会持久保留。

   顺便提一句,保存AWR信息的几个视图中,也是自动创建分区,包括oracle10g,至今没整明白到底根据什么分区的,一般一个分区表里24个快照信息,详细说明可参考其他博文,如有知道的同志请告知在下,不胜感激。

三、总结

对于数据库还是基础不是太牢固,有些浮躁吧,还不能完全沉下心来静静的读、写东西,我们总是盲目的去做实验,或者呆呆的看文档,希望两者能够结合的更好,不能只纸上谈兵,也不能就当一个武将,加油吧。参考《编程艺术》

 

                                 Xysoul_云龙 2014220日星期四 22:50

                              博客地址:http://blog.sina.com.cn/longzhimeng99

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29487349/viewspace-1087264/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29487349/viewspace-1087264/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
A: 创建分区表的语法如下: ``` CREATE TABLE table_name (column1 datatype1, column2 datatype2,...) PARTITION BY RANGE (column_name) ( PARTITION partition_name1 VALUES LESS THAN (value1), PARTITION partition_name2 VALUES LESS THAN (value2), PARTITION partition_name3 VALUES LESS THAN (MAXVALUE) ); ``` 其中,table_name 是表名,column1、column2 是列名和数据类型,column_name 是用于分区的列名。 PARTITION BY RANGE 是分区方式,指定分区键,这里使用了 RANGE 分区方式。 分区名称和分区边界值在 VALUES LESS THAN 之后指定,分区边界值是指定范围内的最大或最小值。 例如,以下示例将创建一个名为 sales 的表,该表使用 sales_date 列作为分区键,并在 2019 年前、2019 年、2020 年和 2021 年之后分成四个分区,每个分区使用不同的表空间: ``` CREATE TABLE sales (id INT PRIMARY KEY, sales_date DATE, sales_amount NUMBER(10,2)) PARTITION BY RANGE (sales_date) ( PARTITION sales_q1_2019 VALUES LESS THAN (TO_DATE('01-APR-2019', 'DD-MON-YYYY')), PARTITION sales_q2_2019 VALUES LESS THAN (TO_DATE('01-JUL-2019', 'DD-MON-YYYY')), PARTITION sales_q3_2019 VALUES LESS THAN (TO_DATE('01-OCT-2019', 'DD-MON-YYYY')), PARTITION sales_q4_2019 VALUES LESS THAN (TO_DATE('01-JAN-2020', 'DD-MON-YYYY')), PARTITION sales_q1_2020 VALUES LESS THAN (TO_DATE('01-APR-2020', 'DD-MON-YYYY')), PARTITION sales_q2_2020 VALUES LESS THAN (TO_DATE('01-JUL-2020', 'DD-MON-YYYY')), PARTITION sales_q3_2020 VALUES LESS THAN (TO_DATE('01-OCT-2020', 'DD-MON-YYYY')), PARTITION sales_q4_2020 VALUES LESS THAN (TO_DATE('01-JAN-2021', 'DD-MON-YYYY')), PARTITION sales_future VALUES LESS THAN (MAXVALUE) ) TABLESPACE sales_ts; ``` 在此示例中,我们根据销售日期对表进行了分区,并提交了三个月和四个季度的数据,每个季度使用了不同的分区。 最后一个分区是用于未来销售数据的。 使用 TABLESPACE 关键字指定为每个分区使用不同的表空间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值