标签:
在海量数据库中,分区是一个应用很广泛的技术。例如一款新闻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(‘体育‘)
)
);
标签:
原文地址:http://www.cnblogs.com/gaexirnn/p/4380046.html