分区表

对于 10gR2 而言,基本上可以分成几类

  1. Range(范围)分区
  2. Hash(哈希)分区
  3. List(列表)分区
  4. 以及组合分区:Range-Hash,Range-List。

一、When 使用 Range 分区

  Range 分区呢是应用范围比较广的表分区方式,它是以列的值的范围来做为分区的划分条件,将记录存放到列值所在的 range 分区中,比如按照时间划分,2008 年 1 季度的数据放到 a 分区,08 年 2 季度的数据放到 b分区,因此在创建的时候呢,需要你指定基于的列,以及分区的范围值,如果某些记录暂无法预测范围,可以创建 maxvalue 分区,所有不在指定范围内的记录都会被存储到 maxvalue 所在分区中,并且支持指定多列做为依赖列,后面在讲 how 的时候会详细谈到。

二、When 使用 Hash 分区

  通常呢,对于那些无法有效划分范围的表,可以使用 hash 分区,这样对于提高性能还是会有一定的帮助。hash 分区会将表中的数据平均分配到你指定的几个分区中,列所在分区是依据分区列的 hash 值自动分配,因此你并不能控制也不知道哪条记录会被放到哪个分区中,hash 分区也可以支持多个依赖列。

三、When 使用 List 分区

  List 分区与 range 分区和 hash 分区都有类似之处,该分区与 range 分区类似的是也需要你指定列的值,但这又不同与 range 分区的范围式列值---其分区值必须明确指定,也不同于hash 分区---通过明确指定分区值,你能控制记录存储在哪个分区。它的分区列只能有一个,而不能像 range 或者 hash 分区那样同时指定多个列做为分区依赖列,不过呢,它的单个分区对应值可以是多个。

四、When 使用组合分区

  如果某表按照某列分区之后,仍然较大,或者是一些其它的需求,还可以通过分区内再建子分区的方式将分区再分区,即组合分区的方式。

  组合分区呢在 10g 中有两种:range-hash,range-list。注意顺序哟,根分区只能是 range 分区,子分区可以是 hash 分区或 list 分区。

如何创建

1、创建 range 分区

1 Create Table t_partition_range ( id number,name varchar2(50) ) Tablespace tbspart
2 Partition By Range(id)(
3     partition t_range_p1 values less than (10) tablespace tbspart01,  --id小于10的记录放入此分区
4     partition t_range_p2 values less than (20) tablespace tbspart02,  --id大于10 小于20的记录放入此分区
5     partition t_range_p3 values less than (30) tablespace tbspart03,
6     partition t_range_pmax values less than (maxvalue) tablespace tbspart04 --大于30的放在此分区,还可以手动增加分区
7 );

需要我们指定的有:

  1. column:分区依赖列(如果是多个,以逗号分隔);
  2. partition:分区名称;
  3. values less than:后跟分区范围值(如果依赖列有多个,范围对应值也应是多个,中间以逗号分隔);
  4. tablespace_clause:分区的存储属性,例如所在表空间等属性(可为空),默认继承基表所在表空间的属性。

2、创建 hash 分区

1 Create Table t_partition_hash (id number,name varchar2(50)) Tablespace tbspart
2 Partition By Hash(id)(
3     partition t_hash_p1 tablespace tbspart01,
4     partition t_hash_p2 tablespace tbspart02,
5     partition t_hash_p3 tablespace tbspart03
6 );
7 --共建立三个分区,所有的记录依据id列,均匀的自动分配在三个分区中

需要我们指定的有:

  1. column:分区依赖列(支持多个,中间以逗号分隔);
  2. partition:指定分区,有两种方式:直接指定分区名,分区所在表空间等信息;只指定分区数量,和可供使用的表空间。
1 --创建 hash 分区 方法二
2 Create Table t_partition_hash2 (id number,name varchar2(50)) Tablespace tbspart
3 Partition By Hash(id)
4 Partitions 3 store in(tbspart01,tbspart02,tbspart03);--分区为3个,分别存储在3个表空间

3、创建 list 分区

1 Create Table t_partition_list (id number,name varchar2(50)) Tablespace tbspart
2 Partition By List(id)(
3     partition t_list_p1 values (1,2,3,4,5,6,7,8,9) tablespace tbspart01, --id为(1,2,3,4,5,6,7,8,9)值时 记录存在此分区
4     partition t_list_p2 values (10,11,12,13,14,15,16,17,18,19) tablespace tbspart02,
5     partition t_list_p3 values (20,21,22,23,24,25,26,27,28,29) tablespace tbspart03,
6     partition t_list_pd values (default) tablespace tbspart04  --id值不在前三个分区范围内 记录则存在此分区
7 );

需要我们指定的有:

  1. column:分区依赖列,注意:只能是一个;
  2. partition:分区名称;
  3. literal:分区对应值,注意:每个分区可以对应多个值

4、创建 range-hash 组合分区

4.1为所有分区各创建 4 个 hash 子分区

 1 Create Table t_partition_rh (id number,name varchar2(50))
 2 Partition By Range(id)                                               --先用id列 做range分区
 3 Subpartition By Hash(name)                                           --在每个range分区中 以name列 做hash分区
 4 Subpartitions 4 Store in (tbspart01, tbspart02, tbspart03,tbspart04) --每个range分区中 含有4个hash分区,其存储表空间与range分区相一致
 5 (
 6  partition t_r_p1 values less than (10) tablespace tbspart01,
 7  partition t_r_p2 values less than (20) tablespace tbspart02,
 8  partition t_r_p3 values less than (30) tablespace tbspart03,
 9  partition t_r_pd values less than (maxvalue) tablespace tbspart04
10  
11 );

4.2对某个分区创建 hash 子分区 

 1 Create Table t_partition_rh (id number,name varchar2(50))
 2 Partition By Range(id) 
 3 Subpartition By Hash(name)
 4 (
 5     partition t_r_p1 values less than (10) tablespace tbspart01,
 6     partition t_r_p2 values less than (20) tablespace tbspart02,
 7     partition t_r_p3 values less than (30) tablespace tbspart03
 8     ( subpartition t_r_p3_h1 tablespace tbspart01,                --只在t_r_p3分区中 建立hash子分区
 9       subpartition t_r_p3_h2 tablespace tbspart02,
10       subpartition t_r_p3_h3 tablespace tbspart03
11     ),
12     partition t_r_pd values less than (maxvalue) tablespace tbspart04
13 );

4.3分区模板的应用

  oracle 还提供了一种称为分区模板的功能,在指定子分区信赖列之后,制订子分区的存储模板,各个分区即会按照子分区模式创建子分区,例如:

 1 Create Table t_partition_rh (id number,name varchar2(50))
 2 Partition By Range(id) 
 3 Subpartition By Hash(name)
 4 Subpartition Template (                             --为每个range分区制定的子分区模版
 5     subpartition h1 tablespace tbspart01,           --通过视图user_tab_subpartitions,看看子分区的表空间由谁决定?
 6     subpartition h2 tablespace tbspart02,
 7     subpartition h3 tablespace tbspart03,
 8     subpartition h4 tablespace tbspart04
 9 )(
10     partition t_r_p1 values less than (10) tablespace tbspart01,
11     partition t_r_p2 values less than (20) tablespace tbspart02,
12     partition t_r_p3 values less than (30) tablespace tbspart03,
13     partition t_r_pd values less than (maxvalue) tablespace tbspart04
14 );

  组合分区相对于普通分区,语法上稍稍复杂了一些,但也正因如此,其子分区的创建可以非常灵活。详细资料可以查看文档

5、创建 range-list 组合分区

  Range-list 组合分区的创建与 range-hash 极为相似,只是子分区为 list 分区。利用模版为每个分区创建list子分区

 1 Create Table t_partition_rl (id number,name varchar2(50))
 2 Partition By Range(id) 
 3 Subpartition By List(name)
 4 Subpartition Template (
 5  subpartition l1 values ('aa') tablespace tbspart01, 
 6  subpartition l2 values ('bb') tablespace tbspart02, --通过视图user_tab_subpartitions,看看子分区的表空间由谁决定?
 7  subpartition l3 values ('cc') tablespace tbspart03,
 8  subpartition l4 values ('dd') tablespace tbspart04
 9 )(
10  partition t_r_p1 values less than (10) tablespace tbspart01,
11  partition t_r_p2 values less than (20) tablespace tbspart02,
12  partition t_r_p3 values less than (30) tablespace tbspart03,
13  partition t_r_pd values less than (maxvalue) tablespace tbspart04
14 );

相关视图:    

  1. user_part_tables:记录分区的表的信息;
  2. user_tab_partitions:记录表的分区的信息
  3. user_tab_subpartitions:记录表的子分区信息
  4. user_part_indexes:记录分区表索引
  5. user_ind_partitions:记录索引分区信息
  6. user_ind_subpartitions:记录索引子分区信息

参考资料:三思笔记

原文地址:https://www.cnblogs.com/polestar/p/3053519.html