转自:http://blog.163.com/zhubinbin0516@126/blog/static/12257726201051735823602/
一、分区表、分区索引概念
为了满足而非常大的数据库的管理,需要创建和使用分区表和分区索引,分区表允许将数据分成成为分区甚至子分区的更小的、更好管理的块。每个分区可以单独管理,可以不依赖其他分区而单独发挥作用,因此可以提供更有利于可用性和性能的结构。
表或索引可以共享相同的逻辑属性,但是可以有不同的物理属性。例如所有分区/子分区可以共享相同的列和约束,但是可以有不同的表空间。
最好可以将表或者索引的分区存储到不同的表空间,这样的好处是:
●
减少数据在多个分区中冲突的可能性
●
可以单独备份和恢复每个分区
●
控制分区与磁盘驱动器之间的映射(平衡I/O负载)
●
改善可管理性、可用性和性能
二、分区方法
1、范围分区
当列数据可以被划分为逻辑范围时(例如年度中的月份),就可以使用范围分区。当数据在整个范围中能被均等地划分时性能最好。如果所划分的分区范围大小明显不同时,则需要考虑其他的分区方法了。
创建范围分区时,需要指定分区列、表示分区边界,例如:
CREATE TABLE
sales
( invoice_no
NUMBER,
sale_year
INT NOT NULL,
sale_month
INT NOT NULL,
sale_day INT
NOT NULL )
PARTITION BY
RANGE (sale_year, sale_month, sale_day)
( PARTITION
sale_q1 VALUES LESS THAN (1999, 04, 01)
TABLLESPACE
tsa,
PARTITION
sale_q2 VALUES LESS THAN (1999, 07, 01)
TABLLESPACE
tsb,
PARTITION
sale_q3 VALUES LESS THAN (1999, 10, 01)
TABLLESPACE
tsc,
PARTITION
sale_q4 VALUES LESS THAN (2000, 01, 01)
TABLLESPACE
tsd );
注:要注意使用不同字符集的数据库时,最字符的分类序列有时是不同的。
2、散列分区
当数据不太容易进行范围划分时,为了性能和管理的原因又想分区时,就可以使用散列分区方法。散列分区将在指定数量的分区中均等得划分数据。创建散列分区需要指定分区列、分区数量(或单独的分区描述)举例如下:
CREATE TABLE
scubagear
(id
NUMBER,
name
VARCHAR2(60))
PARTITION BY
HASH (id)
PARTITIONS
4
STORE IN
(gear1, gear2, gear3, gear4);
3、列表分区
当需要明确得控制如何将行映射到分区时,就需要使用列表分区。可以在每个分区表述中为该分区指定一列离散值。
列表分区与范围分区、散列分区的区别在于
●
范围分区为分列假设了一个值的自然范围,无法将该值范围之外的分区组织在一起
●
散列分区无法对数据的划分进行控制,在逻辑上是无须的
需要注意的是:列表分区无法支持多列分区。具体举例如下:
CREATE TABLE
sales_by_region
(deptno
number,
deptname
varchar2(20),
quarterly_sales number(10,2),
state
varchar2(2))
PARTITION BY
LIST (state)
(PARTITION
q1_northwest VALUES ('OR', 'WA'),
PARTITION
q1_southwest VALUES ('AZ', 'UT', 'NM'),
PARTITION
q1_northeast VALUES ('NY', 'VM', 'NJ'),
PARTITION
q1_southeast VALUES ('FL', 'GA'),
PARTITION
q1_northcentral VALUES ('SD', 'WI'),
PARTITION
q1_southcentral VALUES ('OK', 'TX'));
4、组合分区
组合分区是在分区中使用范围分区,而在子分区中使用散列分区。组合分区很适合于历史数据和条块数据两者,改善了范围分区及其数据放置的管理型。例如一下举例:
CREATE TABLE
scubaqear (equipno NUMBER, equipname VARCHAR(32), price
NUMBER)
PARTITION BY
RANGE (equipno) SUBPARTITION BY
HASH(equipname) |