Oracle 分区表

分区表

1.分区表的概述

  1. 通过使用分区技术,将一张大表拆分成多个表分区(独立的segment),从而提升数据访问的性能,以及日常的可维护性。
  2. 分区键就是决定表中的数据行,属于哪一个分区的一组数据列。在执行DML操作时,ORACLE会根据分区键选择分区。
  3. 分区表中,每个分区的逻辑结构必须相同。如:列名、数据类型。
  4. 分区表中,每个分区的物理存储参数可以不同。如:各个分区所在的表空间
  5. 对于应用而言完全透明,分区前后没有变化,不需要进行修改
  6. 需要注意:虽然各个分区可以存放在不同的表空间中,但这些表空间所使用的块大小(block_size)必须一致。
  7. 需要注意:除了包含LONG以及LONG RAW字段的表无法使用分区外,其他表均可以使用分区,包括含有LOB字段的表。

2. 分区表的优点

  1. 在维护性方面,可以在分区级别,针对单独的分区,进行索引的维护、数据的加载以及备份恢复等操作。大大降低了维护时长
  2. 在可用性方面,由于各个分区相对独立,当一个分区处于维护或者出现故障时,不会影响到其他分区的正常使用
  3. 在性能方面,oracle对于用户的请求,只检索需要的分区,从而提升性能
  4. 在其他方面,由于分区表对于用户是透明的,因此,不需要在分区后,对代码进行修改

3. 常用分区表简介及使用方法

1. 范围分区(range partition)

  1. 特点:
  • 范围分区主要依据分区键定义时给出的键值范围,根据实际的取值,进行分区的选择,进而在相应分区中存储数据
  • 范围分区比较合适存在以数字为导向,方便进行数字范围划分的数据列。如:员工表的雇佣日期列、工资列等
  • 范围分区的数据分布可能不均匀
  1. 规则:
  • 在定义范围分区时,每个分区定义必须使用 values less than(value) 子句。其中(value)表示该分区的上限值
  • 在定义范围分区时,最后一个分区可以是 **values less than(maxvalue)**。其中(maxvalue)表示该分区存储高于其他分区上限值的数据行

2 列表分区(list partition)

  1. 特点:
  • 列表分区主要依据分区键定义时给出的取值列表,根据实际的取值,进行分区的选择,进而在相应分区中存储数据
  • 列表分区比较合适列唯一取值有限,且较为固定的数据列。如:员工表的部门列
  • 列表分区的数据分布可能不均匀
  1. 规则:
  • 在定义范围分区时,每个分区定义必须使用 values(‘value01’,’value02’….) 子句。表示该分区存储包含相关value值的数据行。
  • 在定义范围分区时,最后一个分区可以是 values(DEFAULT) ,表示该分区存储未在其他分区定义的数据行。

3.3 HASH分区(hash partition)

  1. 特点:
  • HASH分区主要通过hash算法确定相应数据行应该被存放到哪个分区中
  • HASH分区比较适合列差异值很多的数据列
  1. 规则:
  • 对于HASH分区,无法控制一条数据在分区间的具体分布。具体分布由hash算法决定
  • 对于HASH分区,如果更改分区的数量,将导致所有数据在分区间的重新分布
  • 在定义HASH分区时,其分区数量应为2的N次方,如:2,4,8,16等

3.4 组合分区(composite partition)

  1. 特点:
  • 组合分区中,主要通过在不同列上,使用“范围分区”、“列表分区”以及“HASH分区”不同组合方式,进而实现组合分区
  • 组合分区中,分区本身没有相应的segment,可以认为是一个逻辑容器,只有子分区拥有实际的segment,用于存放数据
  1. 规则:
  • 在11g以前,组合分区主要有两种组合方式:“RANGE-HASH”以及“RANGE-LIST”
  • 在11g以后,新增了四种组合方式:“RANGE-RANGE”、“LIST-RANGE”、“LIST-HASH”以及“LIST-LIST”

4. 分区表的查看与删除

1.查看分区

1
2
3
SELECT table_name, partition_name
FROM user_tab_partitions
WHERE table_name = '表名';

2.删除分区

分区内存储的数据也将同时删除。

1
2
3
4
--删除分区
ALTER TABLE 表名 DROP PARTITION 分区名 UPDATE GLOBAL INDEXES;
--仅删除分区数据
ALTER TABLE 表名 TRUNCATE PARTITION 分区名 UPDATE GLOBAL INDEXES;