【转】Oracle 11g 新特性 -- INTERVAL分区

Interval 分区

在Oracle Database 11g中可以创建新类型的Interval分区表,Interval类型分区表,可以根据加载数据,自动创建指定间隔的分区。
创建按月分区的分区表:

1. 创建分区表

1 /* Formatted on 2010/6/10 20:21:12 (QP5 v5.115.810.9015) */
2 CREATE TABLE intervalpart (c1 NUMBER, c3 DATE)
3 PARTITION BY RANGE (c3)
4    INTERVAL ( NUMTOYMINTERVAL (1, 'MONTH') )
5    (PARTITION part1
6        VALUES LESS THAN (TO_DATE ('01/12/2010', 'MM/DD/YYYY')),
7     PARTITION part2
8        VALUES LESS THAN (TO_DATE ('02/12/2010', 'MM/DD/YYYY'))
9     );

注意:如果在建Interval分区表是没有把所有的分区写完成,在插入相关数据后会自动生成分区

2. 查看现在表的分区:

1 SQL> select table_name,partition_name from user_tab_partitions where table_name='INTERVALPART';
2 
3 TABLE_NAME                     PARTITION_NAME
4 ------------------------------ ------------------------------
5 INTERVALPART                   PART1
6 INTERVALPART                   PART2

3.  插入测试数据:

1 SQL> begin
2 for i in 0 .. 11 loop
3 insert into intervalpart values(i,add_months(to_date('2010-1-1','yyyy-mm-dd'),i));
4 end loop ;
5 commit;
6 end;
7 /
8 PL/SQL 过程已成功完成。

补充:add_months()函数获取前一个月或者下一个月的月份, 参数中 负数 代表 往前, 正数 代表 往后。

--上一个月

select to_char(add_months(trunc(sysdate),-1),'yyyymm') from dual;

--下一个月 

select to_char(add_months(trunc(sysdate),1),'yyyymm') from dual;

4. 观察自动创建的分区:

 1 SQL>  select table_name,partition_name from user_tab_partitions where table_name='INTERVALPART';
 2 
 3 TABLE_NAME                     PARTITION_NAME
 4 ------------------------------ ------------------------------
 5 INTERVALPART                   PART1
 6 INTERVALPART                   PART2
 7 INTERVALPART                   SYS_P22
 8 INTERVALPART                   SYS_P23
 9 INTERVALPART                   SYS_P24
10 INTERVALPART                   SYS_P25
11 INTERVALPART                   SYS_P26
12 INTERVALPART                   SYS_P27
13 INTERVALPART                   SYS_P28
14 INTERVALPART                   SYS_P29
15 INTERVALPART                   SYS_P30
16 INTERVALPART                   SYS_P31
17 
18 已选择12行。

5. 查看分区内容:

SQL> select * from INTERVALPART;

        C1 C3
---------- ----------
         1 2010-01-01
         0 2010-01-01
         1 2010-02-01
         2 2010-03-01
         3 2010-04-01
         4 2010-05-01
         5 2010-06-01
         6 2010-07-01
         7 2010-08-01
         8 2010-09-01
         9 2010-10-01
        10 2010-11-01
        11 2010-12-01

已选择13行。

 

 1 SQL> select * from INTERVALPART partition(part1);
 2 
 3         C1 C3
 4 ---------- ----------
 5          1 2010-01-01
 6          0 2010-01-01
 7 
 8 SQL> select * from INTERVALPART partition(part2);
 9 
10         C1 C3
11 ---------- ----------
12          1 2010-02-01

下面创建一个以天为间隔的分区表:

1. 创建分区表:

 1 SQL> create table dave
 2 (
 3 id    number,
 4 dt    date
 5 )
 6 partition by range (dt)
 7 INTERVAL (NUMTODSINTERVAL(1,'day'))
 8 (
 9 partition p100101 values less than (to_date('2010-01-01','yyyy-mm-dd'))
10 );

2. 查看表分区:

1 SQL> select table_name,partition_name from user_tab_partitions where table_name='DAVE';
2 
3 TABLE_NAME                     PARTITION_NAME
4 ------------------------------ ------------------------------
5 DAVE                           P100101

3. 插入测试数据:

1 SQL> begin
2 for i in 1 .. 12 loop
3 insert into dave values(i,trunc(to_date('2010-1-1','yyyy-mm-dd')+i));
4 end loop;
5 commit;
6 end;
7 /
8 PL/SQL 过程已成功完成。

4. 观察自动创建的分区:

 1 SQL> select table_name,partition_name from user_tab_partitions where table_name='DAVE';
 2 
 3 TABLE_NAME                     PARTITION_NAME
 4 ------------------------------ ------------------------------
 5 DAVE                           P100101
 6 DAVE                           SYS_P32
 7 DAVE                           SYS_P33
 8 DAVE                           SYS_P34
 9 DAVE                           SYS_P35
10 DAVE                           SYS_P36
11 DAVE                           SYS_P37
12 DAVE                           SYS_P38
13 DAVE                           SYS_P39
14 DAVE                           SYS_P40
15 DAVE                           SYS_P41
16 DAVE                           SYS_P42
17 DAVE                           SYS_P43
18 
19 已选择13行。

5. 查看分区内容:

 1 SQL> select * from dave partition(SYS_P32);
 2 
 3         ID DT
 4 ---------- ----------
 5          1 2010-01-02
 6 
 7 SQL> select * from dave partition(SYS_P33);
 8 
 9         ID DT
10 ---------- ----------
11          2 2010-01-03
12 
13 SQL> select * from dave partition(SYS_P34);
14 
15         ID DT
16 ---------- ----------
17          3 2010-01-04
18 
19 SQL> select * from dave;
20 
21         ID DT
22 ---------- ----------
23          1 2010-01-02
24          2 2010-01-03
25          3 2010-01-04
26          4 2010-01-05
27          5 2010-01-06
28          6 2010-01-07
29          7 2010-01-08
30          8 2010-01-09
31          9 2010-01-10
32         10 2010-01-11
33         11 2010-01-12
34         12 2010-01-13
35 
36 已选择12行。

我们对Interval分区 进行一个总结,通过上面的2个例子我们发现一个现象,就是在创建分区的时候,如果选择了Interval分区,那么在该分区表中,没有创建的分区会自动生成。 这样有什么好处呢?

我们假设一下,由于数据量的巨大,所以表设计为每天一个分区,数据库管理员日常要做的一件重复而无聊的工作就是每隔一天要生成新的分区,用以存储第二天的数据。如果在Oracle 11g,我们就可以用Interval分区很好的实现这个功能,Oracle会自动完成剩下的分区,是不是很方便呢?

posted @ 2013-12-31 14:05  Dev 林  阅读(465)  评论(0编辑  收藏  举报