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