分区是将一个表或索引物理地分解为多个更小、更可管理的部分。它是 oracle 企业版的一个选项,不过要另行收费。标准版中没有这个特性。
oracle 有四种对表分区的方法:
1、区间分区:可指定应当存储在一起的数据区间。例如相同年份的数据存储在一个分区中。
创建语句:CREATE TABLE table_name(col_name ...) PARTITION BY RANGE (col_name)
(PARTITION p1 VALUES LESS THAN v1 tablespace t1,
PARTITION p2 VALUES LESS THAN v2 tablespace t2, PARTITION pn VALUES LESS THAN MAXVALUE tablespace t3)
2、散列分区:指在一个列(或多个列)上应用一个散列函数,行会按这个散列值放在某个分区中。
创建语句:CREATE TABLE table_name(col_name ...) PARTITION BY HASH (col_name) (PARTITION p1, PARTITION p2)
3、列表分区:指定一个离散值集,来确定应当存储在一起的数据。
创建语句:CREATE TABLE table_name(col_name ...) PARTITION BY LIST (col_name)
(PARTITION p1 VALUES (v1,V2,V3), PARTITION p2 VALUES (v4,V5,V6), PARTITION pn VALUES (DEFAULT))
4、组合分区:这是区间分区和散列分区的一种组合,或者是区间分区与列表分区的组合。顶层分区机制总是区间分区。
创建散列子分区语句:CREATE TABLE table_name(col_name ...) PARTITION BY RANGE (col_name)
SUBPARTITION BY HASH (col_name) SUBPARTITIONS 2
(
PARTITION p1 VALUES LESS THAN v1 (subpartition p1_sub1, subpartition p1_sub2),
PARTITION p2 VALUES LESS THAN v2 (subpartition p2_sub1, subpartition p2_sub2)
)
创建列表子分区语句:CREATE TABLE table_name(col_name ...) PARTITION BY RANGE (col_name)
SUBPARTITION BY LIST (col_name)
(
PARTITION p1 VALUES LESS THAN v1 (subpartition p1_sub1 VALUES (v1,V2,V3), subpartition p1_sub2 VALUES (v4,V5,V6)),
PARTITION p2 VALUES LESS THAN v2 (subpartition p2_sub1 VALUES (v1,V2,V3), subpartition p2_sub2 VALUES (v4,V5,V6))
)
行移动:数据的修改会导致行跨分区移动。只有当表启用了行移动时才支持这种情况,否则会报错。同时更新时行的 ROWID 会改变。
启动行移动:ALTER TABLE table_name ENABLE ROW MOVEMENT;
索引与表类似,也可以分区。对索引进行分区有两种可能的方法:
1、随表对索引完成相应的分区:这也称为局部分区索引。每个表分区都有一个索引分区,而且只索引该表分区。
创建语句:CREATE INDEX index_name on table_name(col_name) LOCAL;
2、按区间对索引分区:这也称为全局分区索引。索引按区间分区(或者 10g 中还可以按散列分区),一个索引分区可能指向任何表分区。
创建语句:CREATE INDEX index_name on table_name(col_name) GLOBAL
PARTITION BY RANGE(col_name)
(
PARTITION p1 VALUES LESS THAN v1,
PARTITION p2 VALUES LESS THAN v2
)
oracle 有四种对表分区的方法:
1、区间分区:可指定应当存储在一起的数据区间。例如相同年份的数据存储在一个分区中。
创建语句:CREATE TABLE table_name(col_name ...) PARTITION BY RANGE (col_name)
(PARTITION p1 VALUES LESS THAN v1 tablespace t1,
PARTITION p2 VALUES LESS THAN v2 tablespace t2, PARTITION pn VALUES LESS THAN MAXVALUE tablespace t3)
2、散列分区:指在一个列(或多个列)上应用一个散列函数,行会按这个散列值放在某个分区中。
创建语句:CREATE TABLE table_name(col_name ...) PARTITION BY HASH (col_name) (PARTITION p1, PARTITION p2)
3、列表分区:指定一个离散值集,来确定应当存储在一起的数据。
创建语句:CREATE TABLE table_name(col_name ...) PARTITION BY LIST (col_name)
(PARTITION p1 VALUES (v1,V2,V3), PARTITION p2 VALUES (v4,V5,V6), PARTITION pn VALUES (DEFAULT))
4、组合分区:这是区间分区和散列分区的一种组合,或者是区间分区与列表分区的组合。顶层分区机制总是区间分区。
创建散列子分区语句:CREATE TABLE table_name(col_name ...) PARTITION BY RANGE (col_name)
SUBPARTITION BY HASH (col_name) SUBPARTITIONS 2
(
PARTITION p1 VALUES LESS THAN v1 (subpartition p1_sub1, subpartition p1_sub2),
PARTITION p2 VALUES LESS THAN v2 (subpartition p2_sub1, subpartition p2_sub2)
)
创建列表子分区语句:CREATE TABLE table_name(col_name ...) PARTITION BY RANGE (col_name)
SUBPARTITION BY LIST (col_name)
(
PARTITION p1 VALUES LESS THAN v1 (subpartition p1_sub1 VALUES (v1,V2,V3), subpartition p1_sub2 VALUES (v4,V5,V6)),
PARTITION p2 VALUES LESS THAN v2 (subpartition p2_sub1 VALUES (v1,V2,V3), subpartition p2_sub2 VALUES (v4,V5,V6))
)
行移动:数据的修改会导致行跨分区移动。只有当表启用了行移动时才支持这种情况,否则会报错。同时更新时行的 ROWID 会改变。
启动行移动:ALTER TABLE table_name ENABLE ROW MOVEMENT;
索引与表类似,也可以分区。对索引进行分区有两种可能的方法:
1、随表对索引完成相应的分区:这也称为局部分区索引。每个表分区都有一个索引分区,而且只索引该表分区。
创建语句:CREATE INDEX index_name on table_name(col_name) LOCAL;
2、按区间对索引分区:这也称为全局分区索引。索引按区间分区(或者 10g 中还可以按散列分区),一个索引分区可能指向任何表分区。
创建语句:CREATE INDEX index_name on table_name(col_name) GLOBAL
PARTITION BY RANGE(col_name)
(
PARTITION p1 VALUES LESS THAN v1,
PARTITION p2 VALUES LESS THAN v2
)