10.2.5 复合分区
复合分区是指先对表进行范围分区,然后对每个分区再进行散列分区或列表分区,产生若干子分区。根据子分区的划分方法不同,复合分区可分为范围分区-散列分区和范围分区-列表分区。
对表进行复合分区后,分区仅仅是逻辑上的概念,只有子分区才是物理上的对象。每个子分区对应一个段,它们可分别位于不同的表空间中,但是同一个分区的所有子分区具有相同的存储参数。
现在仍以产品销售表为例来说明复合分区的用法。如果销售数据很多,并且销售城市遍布全国各地,那么我们可以考虑先按照销售的月份对表进行范围分区,使销售数据按季度分布在四个范围分区中,然后对每个分区再进行散列分区,划分若干子分区,使一个季度的销售数据再按照销售城市的不同而均匀分布在各个子分区中。以下是创建这个分区表的语句:
SQL>CREATE TABLE sales(
sales_id number(6),
year number(4),
month number(2),
day number(2),
salesman char(8),
city char(10))
PARTITION BY RANGE(month)
SUBPARTITION BY HASH(city)
(PARTITION P1 VALUES LESS THAN(4)
(SUBPARTITION P11,
SUBPARTITION P12,
SUBPARTITION P13
),
PARTITION P2 VALUES LESS THAN(7)
(SUBPARTITION P21,
SUBPARTITION P22,
SUBPARTITION P23
),
PARTITION P3 VALUES LESS THAN(10)
(SUBPARTITION P31,
SUBPARTITION P32,
SUBPARTITION P33
),
PARTITION P4 VALUES LESS THAN(13)
(SUBPARTITION P41,
SUBPARTITION P42,
SUBPARTITION P43
));
在上述例子中,先按照月份对表进行范围分区,定义了四个分区,然后对每个分区再按照城市进行散列分区,产生3个子分区,这样一共产生了12个子分区。定义子分区的子句是SUBPARTITION。
对于每个分区,我们可以为其指定存储参数,该分区中的所有子分区都使用同样的存储参数。对于每个子分区,我们可以用TABLESPACE子句为其指定所属的表空间,使这些子分区分别位于不同的表空间中。
总之,创建分区表的目的是把数据的查询或统计限制在一定范围之内,以减少磁盘I/O。在这些表上执行DML命令时,和普通表没有什么区别,只不过数据将按照分区的条件被写入到不同的段中。