Oracle 分区表详解(范围分区Range、哈希分区Hash、列表分区List)
当单表数据量随着时间变的越来越大时,会给数据的管理和查询带来不便。我们可以考虑对表进行分区,利用分区表特性将数据分成小块存储,可以大幅提升查询性能,管理便捷性及数据的可用性。
一、分区表概述
1.1 分区表概念
分区表就是将表在物理存储层面分成多个小的片段,这些片段即称为分区,每个分区保存表的一部分数据,表的分区对上层应用是完全透明的,从应用的角度来看,表在逻辑上依然是一个整体。
每个分区都有自己的名字并可以拥有不同的存储特性,例如可以将分区保存在不同的磁盘以上分散I/O,或者分散在不同的表空间(表空间需要有相同的block size)。
向分区表插入数据时,为了判断每条数据应该被分配至哪个分区,我们通常需要选择定义一个分区键(Partition Key)。根据每条数据分区键的值或者对其运算的结果来决定数据的分区归属,分区键可以由1或多个列组成(最多16个列).
1.2 何时使用分区表
知道了分区表的概念,那么什么情况下应该使用分区表呢?如果遇到如下几个场景你可以考虑使用分区表:
表的大小超过2G
表中有大量的历史数据,数据存在明显的时间顺序
表的存储必须分散在不同的存储设备上
1.3 分区表的优点
分区表在结构和管理上比普通表更复杂,但它也有一定的优点,主要优点有以下3类:
1.3.1 提升SQL查询性能
对于SQL查询,当where条件涉及分区键时,可以快速定位需要扫描的分区,这样可以将数据的扫描范围限制在很小的范围,极大的提升查询性能。这个特性叫做分区裁剪(Partition Pruning)。
另外,在多表连接(join)时,如果在每个表在连接的键上都进行了分区,那么Oracle可以将两个大表之间的连接转换成更小的分区级连接,极大提升连接速度,这个特性叫做分区连接(Partition-wise Join)。
1.3.2 提升表可管理性
使用分区表之后,原来表级别的管理操作也被分散为至“分区级”,各个分区上独立的进行运维任务,原先一个大表上的运维任务,现在可以拆开成一系列小任务分散在不同的时间窗口执行。例如,平时备份表的操作,现在可以备份单个分区。
1.3.3 提升数据可用性
当表分区后,每个分区都具有独立性。在你操作某个分区时,不会影响其他分区数据的使用,即使某个分区因为故障不可用,也完全不会影响其他分区上运行的事务。同时分区可以存储在不同的表空间/物理介质上,分散I/O压力。
二、基础分区策略
根据不同的应用场景,你可以为表选择不同的分区策略,Oracle提供的基础分区策略有:
在基础分区策略的基础上,还有一些其他的扩展分区策略,后面再进行讨论。