11.2.1 范围分区
创建范围分区的关键字是RANGE,创建该分区后,其中的数据可以根据分区键值指定的范围进行分布,当数据在范围内均匀分布时,性能最好。例如,如果选择一个日期列作为分区键,分区“AUG-2011”就会包括所有从01-AUG-2011到31-AUG-2011之间的分区键值(假设分区的范围是从该月的第一天到该月的最后一天)。
当表结构采用范围分区时,首先要考虑分区的列应该符合范围分区的方法;其次要考虑列的数据值的取值范围;最后考虑列的边界问题,下面通过若干具体实例来演示范围分区的创建。
【例11.1】 创建一个商品零售表,然后为该表按照销售日期所在的季度创建4个分区,代码及运行结果如下(实例位置:光盘\TM\sl\11\1)。
SQL> create table ware_retail_part --创建一个描述商品零售的数据表
2 (
3 id integer primary key, --销售编号
4 retail_date date, --销售日期
5 ware_name varchar2(50) --商品名称
6 )
7 partition by range(retail_date)
8 (
9 --2011年第一个季度为par_01分区
10 partition par_01 values less than(to_date('2011-04-01','yyyy-mm-dd')) tablespace TBSP_1,
11 --2011年第二个季度为par_02分区
12 partition par_02 values less than(to_date('2011-07-01','yyyy-mm-dd')) tablespace TBSP_1,
13 --2011年第三个季度为par_03分区
14 partition par_03 values less than(to_date('2011-10-01','yyyy-mm-dd')) tablespace TBSP_2,
15 --2011年第四个季度为par_04分区
16 partition par_04 values less than(to_date('2012-01-01','yyyy-mm-dd')) tablespace TBSP_2
17 );
表已创建。
在为商品零售表ware_retail_part创建了4个范围分区之后,下面向该表中插入若干条记录。
【例11.2】 向表ware_retail_part插入3条记录,代码及运行结果如下。
SQL> insert into ware_retail_part values(1,to_date('2011-01-20','yyyy-mm-dd'),'
平板电脑');
已创建 1 行。
SQL> insert into ware_retail_part values(2,to_date('2011-04-15','yyyy-mm-dd'),'s
智能手机');
已创建 1 行。
SQL> insert into ware_retail_part values(3,to_date('2011-07-25','yyyy-mm-dd'),'s
MP5');
已创建 1 行。
在向ware_retail_part表中插入若干条记录之后,用户就可以通过分区表(即进行了分区的数据表)来查询数据了,这种方式的查询速度要比从整个表中查询快得多,使用分区表查看数据的例子如下。
【例11.3】 查询数据表ware_retail_part中分区par_02中的全部记录,代码如下。
SQL> select * from ware_retail_part partition(par_02);
本例运行结果如图11.1所示。
另外,Range分区的字段可以是两个或者多个,来看下面的例子。
【例11.4】 创建一个商品零售表,然后为该表按照销售编号和销售日期的组合创建3个分区,代码及运行结果如下(实例位置:光盘\TM\sl\11\2)。
SQL> create table ware_retail_part2 --创建一个描述商品零售的数据表
2 (
3 id integer primary key, --销售编号
4 retail_date date, --销售日期
5 ware_name varchar2(50) --商品名称
6 )
7 partition by range(id,retail_date) --按照销售序号和销售日期分区
8 (
9 --第一个分区par_01
10 partition par_01 values less than(10000,to_date('2011-12-01','yyyy-mm-dd')) tablespace TBSP_1,
11 --第一个分区par_02
12 partition par_02 values less than(20000,to_date('2012-12-01','yyyy-mm-dd')) tablespace TBSP_1,
13 --第一个分区par_03
14 partition par_03 values less than(maxvalue,maxvalue) tablespace TBSP_2 15 );
表已创建。
在上面的例子中,partition by range(id,retail_date)作为分区方法,id和retail_date作为分区键,即按销售编号和销售日期的组合来进行区分。语句“partition par_01 values less than(10000,to_date('2011-12- 01', 'yyyy-mm-dd')) tablespace TBSP_1”表示一个分区的定义,当插入记录的销售日期小于2011年12月1日,并且销售编号小于10000时,则将该记录划为分区par_01并存放在TBSP_1表空间上。
11.2.2 散列分区
HASH分区,也叫做散列分区,是在列的取值难以确定的情况下采用的分区方法。比如,按照身份证号进行分区,就很难确定身份证号的分区范围。HASH实际上是一种函数算法,当向表中插入数据时,系统会自动根据当前分区列的值计算出HASH值,然后确定应该将该行存放于哪个表空间中。
HASH分区通过指定分区编号将数据均匀分布在磁盘设备上,使得这些分区大小一致,这充分降低了I/O磁盘争用的情况,但是该分区方法对于范围查询或不等式查询起不到优化的作用。
一般来说,下面几种情况可以采用HASH分区。
? HASH分区可以由HASH键来分布。
? DBA无法获知具体的数据值。
? 数据的分布由Oracle处理。
? 每个分区有自己的表空间。
下面通过几个示例来演示如何创建散列分区。
【例11.5】 创建一个商品零售表,然后将该表id列的值根据自身情况散列地存放在指定的两个表空间中,代码及运行结果如下(实例位置:光盘\TM\sl\11\3)。
……