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

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

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

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

1. 创建分区表:

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行。

4. 查看每个分区里的内容:https://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类型分区表,可以根据加载数据,自动创建指定间隔的分区。

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.  插入测试数据:https://www.cndba.cn/dave/article/171

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()函数获取前一个月或者下一个月的月份, 参数中 负数 代表 往前, 正数 代表 往后。

--上一个月

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

--下一个月

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

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

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

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

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

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

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

4. 观察自动创建的分区:https://www.cndba.cn/dave/article/171

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行。

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值