ORACLE 分区

前言

  在海量数据库中,分区是一个应用很广泛的技术。例如一款新闻APP的后台数据库,用户访问记录数据表可以通过访问时间来进行范围分区。

 

  根据ORACLE API上的描述,分区可以分为以下三种:

  范围分区;

  哈希分区;

  列表分区;

  在实际应用中,还有第四种分区类型:组合分区。

范围分区

  范围分区可能是在实际应用中,应用范围最广泛的分区类型。根据数据表中某个字段的值,以固定的范围来划分数据。

  例如上述的用户访问记录表,可以通过访问时间来进行分区

partition by range(t_time)

(

partition table_name_2015 values less than(to_date(‘2015‘,‘yyyy‘)),

partition table_name_2016 values less than(to_date(‘2016‘,‘yyyy‘)),

partition table_name_2017 values less than(to_date(‘2017‘,‘yyyy‘)),

partition table_name_2018 values less than(to_date(‘2018‘,‘yyyy‘)),

partition table_name_2019 values less than(to_date(‘2019‘,‘yyyy‘)),

partition table_name_2020 values less than(to_date(‘2020‘,‘yyyy‘))

);

  这是从2015年建立分区,建立到2020年,每一年的数据都会单独保存在一个分区内。需要注意的是如果时间不在2015-2020范围内的数据,会全部保存在一个分区内。可以在创建表的划分了几十年的分区,或者后期追加分区。

  范围分区在数据过期化处理能发挥非常好的作用,我们可以将过期的数据保存在历史数据库中进行备份,然后删除过期数据所在分区。

  如果需要对数据库中的数据进行过期化处理,范围分区几乎是唯一的选择。

哈希分区

  当一张数据表中数据需要平均分配到各个分区的时候,就能用上哈希分区了。按照oracle官方要求,分区的数量应该是2的平方。

  partition by hash(t_id) partition 8 as select * from table_name;

  上面是在table_name表中,t_id作为hash列,建立了8个哈希分区。

  因为哈希分区的特殊性,在操作上会有一些限制,例如不能对哈希分区进行drop、split、merge操作。

  但可以使用truncate的方式来清楚分区中的数据。

  如果想要每个分区的数据分布比较均匀,被hash的列上的数据重复率越低越好,否则达到不了预期的效果,甚至会出现在分区中分布严重不均匀的情况。

  这样看来,UUID形式的主键作为hash列是个不错的选择。

列表分区

  如果数据表中的数据有一列中的数据重复率特别高,例如新闻表中的栏目列,可以考虑使用列表分区。

partition by list(t_column)

(

partition technology values(‘数码‘,‘科技‘),

partition sports values(‘体育‘),

partition other values(default)

)

  上面是根据列t_column来进行列表分区,列中内容是数码、科技的数据在technology分区中;列中内容是体育的数据在sports分区中,其他的数据在other分区中。

组合分区

  在实际应用中,按照业务需求,也可以将上面的几种分区创建组合分区。

partition by range(t_time) subpartition by hash(t_id)

(

partition table_name_2015 values less than(to_date(‘2015‘,‘yyyy‘))(

subpartition sp1,

subpartition sp2

),

partition table_name_2016 values less than(to_date(‘2016‘,‘yyyy‘))(

subpartition sp3,

subpartition sp4

)

)

  上面创建了一个人范围-哈希组合分区。将范围分区下的数据在进行哈希分区。也可以在范围分区下进行列表分区,如下:

partition by range(t_time) subpartition by list(t_column)

(

partition table_name_2015 values less than(to_date(‘2015‘,‘yyyy‘))(

subpartition sp1 values(‘数码‘,‘科技‘),

subpartition sp2 values(‘体育‘)

),

partition table_name_2016 values less than(to_date(‘2016‘,‘yyyy‘))(

subpartition sp3 values(‘数码‘,‘科技‘),

subpartition sp4 values(‘体育‘)

)

);

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。