最近一段时间在做数据统计报表用到了表分区,所以最近就看了看,拿来研究研究。
一.范围分区
范围分区将数据基于范围映射到每一个分区,这个范围是你在创建分区时指定的分区键决定的。
--例一取值范围:
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) ); |