oracle 建立分区表

最近一段时间在做数据统计报表用到了表分区,所以最近就看了看,拿来研究研究。 

一.范围分区
范围分区将数据基于范围映射到每一个分区,这个范围是你在创建分区时指定的分区键决定的。

--例一取值范围:
CREATE TABLE CUSTOMER
(
     CUSTOMER_ID NUMBER NOT NULL PRIMARY KEY ,
     FIRST_NAME  VARCHAR2(30) NOT NULL ,
     LAST_NAME   VARCHAR2(30) NOT NULL ,
     PHONE        VARCHAR2(15) NOT NULL ,
     EMAIL        VARCHAR2(80),
     STATUS       CHAR (1)
)
PARTITION BY RANGE (CUSTOMER_ID)
(
     PARTITION CUS_PART1 VALUES LESS THAN (100000) TABLESPACE CUS_TS01,
     PARTITION CUS_PART2 VALUES LESS THAN (200000) TABLESPACE CUS_TS02,
     PARTITION  CUS_PART3 VALUES  LESS  THEN (MAXVALUE) TABLESPACE  CUS_TS02
)
--例二按时间划分(随着时间的增长,还需要添加分区表):
CREATE TABLE ORDER_ACTIVITIES
(
     ORDER_ID      NUMBER(7) NOT NULL ,
     ORDER_DATE    DATE ,
     TOTAL_AMOUNT NUMBER,
     CUSTOTMER_ID NUMBER(7),
     PAID           CHAR (1)
)
PARTITION BY RANGE (ORDER_DATE)
(
   PARTITION ORD_ACT_PART01 VALUES LESS THAN (TO_DATE( '01- MAY -2003' , 'DD-MON-YYYY' )) TABLESPACE ORD_TS01,
   PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE( '01-JUN-2003' , 'DD-MON-YYYY' )) TABLESPACE ORD_TS02,
   PARTITION ORD_ACT_PART03 VALUES LESS THAN (TO_DATE( '01-JUL-2003' , 'DD-MON-YYYY' )) TABLESPACE ORD_TS03
)

二.列表分区
该分区的特点是某列的值只有几个,基于这样的特点我们可以采用列表分区。

--这个是我在自己电脑上测试的实例,一个sql竞赛的资料库中的数据
create table p_t2(a1 number,a2 varchar2(10),a3 varchar2(30),a4 varchar2(10),a5 number)
     partition by list(a2)
     (partition p_tcp  values ( 'tcp' ) tablespace p1,
     partition p_udp  values ( 'udp' ) tablespace p2,
     partition p_icmp  values ( 'icmp' ) tablespace p3)

三.散列分区
这类分区是在列值上使用散列算法,以确定将行放入哪个分区中。当列的值没有合适的条件时,建议使用散列分区。
散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O设备上进行散列分区,使得这些分区大小一致。

CREATE TABLE HASH_TABLE
(
   COL NUMBER(8),
   INF VARCHAR2(100)
)
PARTITION BY HASH (COL)
(
   PARTITION PART01 TABLESPACE HASH_TS01,
   PARTITION PART02 TABLESPACE HASH_TS02,
   PARTITION PART03 TABLESPACE HASH_TS03
)
--简写:
CREATE TABLE emp
(
     empno NUMBER (4),
     ename VARCHAR2 (30),
     sal   NUMBER
)
PARTITION BY  HASH (empno) PARTITIONS 8
STORE IN (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);

四.组合范围散列分区
这种分区是基于范围分区和列表分区,表首先按某列进行范围分区,然后再按某列进行列表分区,分区之中的分区被称为子分区。

CREATE TABLE SALES
(
PRODUCT_ID VARCHAR2(5),
SALES_DATE DATE ,
SALES_COST NUMBER(10),
STATUS VARCHAR2(20)
)
PARTITION BY RANGE(SALES_DATE) SUBPARTITION BY LIST (STATUS)
(
    PARTITION P1 VALUES LESS THAN(TO_DATE( '2003-01-01' , 'YYYY-MM-DD' ))TABLESPACE rptfact2009
           (
               SUBPARTITION P1SUB1 VALUES ( 'ACTIVE' ) TABLESPACE rptfact2009,
               SUBPARTITION P1SUB2 VALUES ( 'INACTIVE' ) TABLESPACE rptfact2009
           ),
    PARTITION P2 VALUES LESS THAN (TO_DATE( '2003-03-01' , 'YYYY-MM-DD' )) TABLESPACE rptfact2009
           (
               SUBPARTITION P2SUB1 VALUES ( 'ACTIVE' ) TABLESPACE rptfact2009,
               SUBPARTITION P2SUB2 VALUES ( 'INACTIVE' ) TABLESPACE rptfact2009
           )
)

五.复合范围散列分区
这种分区是基于范围分区和散列分区,表首先按某列进行范围分区,然后再按某列进行散列分区。

create table dinya_test
  (
  transaction_id number primary key ,
  item_id number(8) not null ,
  item_description varchar2(300),
  transaction_date date
  )
  partition by range(transaction_date)subpartition by hash(transaction_id)  subpartitions 3 store in (dinya_space01,dinya_space02,dinya_space03)
  (
      partition part_01 values less than(to_date(‘2006-01-01’,’yyyy-mm-dd’)),
      partition part_02 values less than(to_date(‘2010-01-01’,’yyyy-mm-dd’)),
      partition part_03 values less than(maxvalue)
  );



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值