签到成功

知道了

CNDBA社区CNDBA社区

Oracle 11g 分区表 之 Interval分区 和 虚拟列分区

2016-09-02 17:05 5280 0 原创 Oracle 11g
作者: dave

Oracle 11g 中的分区表支持Interval分区和虚拟列分区,这里看2个具体的示例。


一.虚拟列分区: 按星期分区表



1. 创建分区表:http://www.cndba.cn/dave/article/171

CREATE TABLE PT
(
   getdate   date NOT NULL,
   wd        NUMBER GENERATED ALWAYS AS (TO_NUMBER (TO_CHAR (getdate, 'D'))) VIRTUAL
)
PARTITION BY LIST (wd)
   (PARTITION Sun  VALUES (1),
    PARTITION Mon  VALUES (2),
    PARTITION Tue  VALUES (3),
    PARTITION Wed  VALUES (4),
    PARTITION Thu  VALUES (5),
    PARTITION Fri  VALUES (6),
PARTITION Sat   VALUES (7)
);



2. 插入测试数据

SQL> insert into pt(getdate) values(sysdate);
已创建 1 行。
SQL> insert into pt(getdate) values(sysdate-1);
已创建 1 行。
SQL> insert into pt(getdate) values(sysdate-2);
已创建 1 行。
SQL> insert into pt(getdate) values(sysdate-3);
已创建 1 行。
SQL> insert into pt(getdate) values(sysdate-4);
已创建 1 行。
SQL> insert into pt(getdate) values(sysdate-5);
已创建 1 行。
SQL> insert into pt(getdate) values(sysdate-6);
已创建 1 行。
SQL> insert into pt(getdate) values(sysdate-7);
已创建 1 行。
SQL> commit;
提交完成。



3. 查看数据:

SQL> select * from pt;
GETDATE                WD
-------------- ----------
06-6月 -10              1
07-6月 -10              2
08-6月 -10              3
09-6月 -10              4
10-6月 -10              5
03-6月 -10              5
04-6月 -10              6
05-6月 -10              7
已选择8行。
SQL> alter session set nls_date_format='YYYY-MM-DD';
会话已更改。
SQL> select * from pt;
GETDATE            WD
---------- ----------
2010-06-06          1
2010-06-07          2
2010-06-08          3
2010-06-09          4
2010-06-10          5
2010-06-03          5
2010-06-04          6
2010-06-05          7
已选择8行。


http://www.cndba.cn/dave/article/171


4. 查看每个分区里的内容:http://www.cndba.cn/dave/article/171

SQL> select * from pt partition(sun);
GETDATE            WD
---------- ----------
2010-06-06          1
SQL> select * from pt partition(mon);
GETDATE            WD
---------- ----------
2010-06-07          2
SQL> select * from pt partition(tue);
GETDATE            WD
---------- ----------
2010-06-08          3
SQL> select * from pt partition(wed);
GETDATE            WD
---------- ----------
2010-06-09          4
SQL> select * from pt partition(fri);
GETDATE            WD
---------- ----------
2010-06-04          6
SQL> select * from pt partition(sat);
GETDATE            WD
---------- ----------
2010-06-05          7
SQL>




二. Interval分区


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

http://www.cndba.cn/dave/article/171


2.1 创建按月分区的分区表:


1. 创建分区表

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

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


2. 查看现在表的分区:

SQL> select table_name,partition_name from user_tab_partitions where table_name='INTERVALPART';
TABLE_NAME                     PARTITION_NAME
------------------------------ ------------------------------
INTERVALPART                   PART1
INTERVALPART                   PART2



3.  插入测试数据:

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  /
PL/SQL 过程已成功完成。



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

 

--上一个月

http://www.cndba.cn/dave/article/171

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



--下一个月 

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




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

SQL>  select table_name,partition_name from user_tab_partitions where table_name='INTERVALPART';
TABLE_NAME                     PARTITION_NAME
------------------------------ ------------------------------
INTERVALPART                   PART1
INTERVALPART                   PART2
INTERVALPART                   SYS_P22
INTERVALPART                   SYS_P23
INTERVALPART                   SYS_P24
INTERVALPART                   SYS_P25
INTERVALPART                   SYS_P26
INTERVALPART                   SYS_P27
INTERVALPART                   SYS_P28
INTERVALPART                   SYS_P29
INTERVALPART                   SYS_P30
INTERVALPART                   SYS_P31
已选择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行。
SQL> select * from INTERVALPART partition(part1);
        C1 C3
---------- ----------
         1 2010-01-01
         0 2010-01-01
SQL> select * from INTERVALPART partition(part2);
        C1 C3
---------- ----------
         1 2010-02-01



http://www.cndba.cn/dave/article/171

http://www.cndba.cn/dave/article/171
http://www.cndba.cn/dave/article/171

2.2 创建一个以天为间隔的分区表:http://www.cndba.cn/dave/article/171



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. 查看表分区:

SQL> select table_name,partition_name from user_tab_partitions where table_name='DAVE';
TABLE_NAME                     PARTITION_NAME
------------------------------ ------------------------------
DAVE                           P100101



3. 插入测试数据:

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  /
PL/SQL 过程已成功完成。


http://www.cndba.cn/dave/article/171


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

SQL> select table_name,partition_name from user_tab_partitions where table_name='DAVE';
TABLE_NAME                     PARTITION_NAME
------------------------------ ------------------------------
DAVE                           P100101
DAVE                           SYS_P32
DAVE                           SYS_P33
DAVE                           SYS_P34
DAVE                           SYS_P35
DAVE                           SYS_P36
DAVE                           SYS_P37
DAVE                           SYS_P38
DAVE                           SYS_P39
DAVE                           SYS_P40
DAVE                           SYS_P41
DAVE                           SYS_P42
DAVE                           SYS_P43
已选择13行。



5. 查看分区内容:

SQL> select * from dave partition(SYS_P32);
        ID DT
---------- ----------
         1 2010-01-02
SQL> select * from dave partition(SYS_P33);
        ID DT
---------- ----------
         2 2010-01-03
SQL> select * from dave partition(SYS_P34);
        ID DT
---------- ----------
         3 2010-01-04
SQL> select * from dave;
        ID DT
---------- ----------
         1 2010-01-02
         2 2010-01-03
         3 2010-01-04
         4 2010-01-05
         5 2010-01-06
         6 2010-01-07
         7 2010-01-08
         8 2010-01-09
         9 2010-01-10
        10 2010-01-11
        11 2010-01-12
        12 2010-01-13
已选择12行。

 

 


版权声明:本文为博主原创文章,未经博主允许不得转载。

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
dave

dave

关注

人的一生应该是这样度过的:当他回首往事的时候,他不会因为虚度年华而悔恨,也不会因为碌碌无为而羞耻;这样,在临死的时候,他就能够说:“我的整个生命和全部精力,都已经献给世界上最壮丽的事业....."

  • 2261
    原创
  • 3
    翻译
  • 578
    转载
  • 191
    评论
  • 访问:7977012次
  • 积分:4346
  • 等级:核心会员
  • 排名:第1名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ