分区表
1.分区表的概述
- 通过使用分区技术,将一张大表拆分成多个表分区(独立的segment),从而提升数据访问的性能,以及日常的可维护性。
- 分区键就是决定表中的数据行,属于哪一个分区的一组数据列。在执行DML操作时,ORACLE会根据分区键选择分区。
- 分区表中,每个分区的逻辑结构必须相同。如:列名、数据类型。
- 分区表中,每个分区的物理存储参数可以不同。如:各个分区所在的表空间
- 对于应用而言完全透明,分区前后没有变化,不需要进行修改
- 需要注意:虽然各个分区可以存放在不同的表空间中,但这些表空间所使用的块大小(block_size)必须一致。
- 需要注意:除了包含LONG以及LONG RAW字段的表无法使用分区外,其他表均可以使用分区,包括含有LOB字段的表。
2. 分区表的优点
- 在维护性方面,可以在分区级别,针对单独的分区,进行索引的维护、数据的加载以及备份恢复等操作。大大降低了维护时长
- 在可用性方面,由于各个分区相对独立,当一个分区处于维护或者出现故障时,不会影响到其他分区的正常使用
- 在性能方面,oracle对于用户的请求,只检索需要的分区,从而提升性能
- 在其他方面,由于分区表对于用户是透明的,因此,不需要在分区后,对代码进行修改
3. 常用分区表简介及使用方法
1. 范围分区(range partition)
- 特点:
- 范围分区主要依据分区键定义时给出的键值范围,根据实际的取值,进行分区的选择,进而在相应分区中存储数据
- 范围分区比较合适存在以数字为导向,方便进行数字范围划分的数据列。如:员工表的雇佣日期列、工资列等
- 范围分区的数据分布可能不均匀
- 规则:
- 在定义范围分区时,每个分区定义必须使用 values less than(value) 子句。其中(value)表示该分区的上限值
- 在定义范围分区时,最后一个分区可以是 **values less than(maxvalue)**。其中(maxvalue)表示该分区存储高于其他分区上限值的数据行
2 列表分区(list partition)
- 特点:
- 列表分区主要依据分区键定义时给出的取值列表,根据实际的取值,进行分区的选择,进而在相应分区中存储数据
- 列表分区比较合适列唯一取值有限,且较为固定的数据列。如:员工表的部门列
- 列表分区的数据分布可能不均匀
- 规则:
- 在定义范围分区时,每个分区定义必须使用 values(‘value01’,’value02’….) 子句。表示该分区存储包含相关value值的数据行。
- 在定义范围分区时,最后一个分区可以是 values(DEFAULT) ,表示该分区存储未在其他分区定义的数据行。
3.3 HASH分区(hash partition)
- 特点:
- HASH分区主要通过hash算法确定相应数据行应该被存放到哪个分区中
- HASH分区比较适合列差异值很多的数据列
- 规则:
- 对于HASH分区,无法控制一条数据在分区间的具体分布。具体分布由hash算法决定
- 对于HASH分区,如果更改分区的数量,将导致所有数据在分区间的重新分布
- 在定义HASH分区时,其分区数量应为2的N次方,如:2,4,8,16等
3.4 组合分区(composite partition)
- 特点:
- 组合分区中,主要通过在不同列上,使用“范围分区”、“列表分区”以及“HASH分区”不同组合方式,进而实现组合分区
- 组合分区中,分区本身没有相应的segment,可以认为是一个逻辑容器,只有子分区拥有实际的segment,用于存放数据
- 规则:
- 在11g以前,组合分区主要有两种组合方式:“RANGE-HASH”以及“RANGE-LIST”
- 在11g以后,新增了四种组合方式:“RANGE-RANGE”、“LIST-RANGE”、“LIST-HASH”以及“LIST-LIST”
4. 分区表的查看与删除
1.查看分区
1 | SELECT table_name, partition_name |
2.删除分区
分区内存储的数据也将同时删除。
1 | --删除分区 |