表分区的优缺点
表分区有以下优点:
1、改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。
1、改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。
2、增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;
3、维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;
4、均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。
缺点:
分区表相关:已经存在的表没有方法可以直接转化为分区表。不过 Oracle 提供了在线重定义表的功能。
分区表相关:已经存在的表没有方法可以直接转化为分区表。不过 Oracle 提供了在线重定义表的功能。
分区存储要在创建表的时候使用,已经创建好的表不能分区。
范围分区:
使用VALUES
LESS
THEN字句创建,最后一个分区可以使用关键字
MAXVALUE,表示所有大于倒数第二个分区和空值的数据都存储到最后一个分区,最后一个分区使用MAXVALUE,表示该分区不设置上限。
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_PART02
VALUES
LESS
THAN
(
MAXVALUE)
TABLESPACE
ORD_TS03
)
列表分区:
该分区的特点是某列的值只有几个,基于这样的特点我们可以采用列表分区。
CREATE
TABLE
ListTable
(
id
INT
PRIMARY
KEY
,
name
VARCHAR
(20),
area
VARCHAR
(10
)
)
PARTITION
BY
LIST
(area)
(
PARTITION
part1
VALUES
('guangdong',
'beijing')
TABLESPACE
Part1_tb,
PARTITION
part2
VALUES
('shanghai',
'nanjing')
TABLESPACE
Part2_tb
);
散列分区:
这类分区是在列值上使用散列算法,以确定将行放入哪个分区中。当列的值没有合适的条件时,建议使用散列分区。
这类分区是在列值上使用散列算法,以确定将行放入哪个分区中。当列的值没有合适的条件时,建议使用散列分区。
散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O设备上进行散列分区,使得这些分区大小一致。
--例子1
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
)
)
--例子2
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
)
);