一、前言:手里一个项目里有一个业务逻辑中的历史数据表,因为数据量太大,所以导致业务处理时间过长,所以leader让我把这些个历史数据表进行分区。
二、场景:表分区有两种场景(我能想到的),一种是在项目架构时就考虑到了大数据量的情况,此为新建分区表;一种是在项目已经上线一段时间后发现,数据量远远比当初要大,所以需要将表分区来进行效率提高(已有表进行分区)。
我这里是第二种情况,但是我研究了下已有表进行分区的实现后,发现以这种方式解决问题并不划算。这里就需要说起两种分区的实现逻辑了。新建分区表实现和普通的create table格式一样,只是后面会加上分区的方式(后面会详细介绍),而已有表的分区是不能直接修改目标表的表结构的,所以需要添加一个中间表,将目标表的数据同步到中间表中。那么已有表分区就存在几个问题,一是数据的实时同步,二是如果在之前的业务逻辑中大量使用了该表,那么需要大批量的改动。所以我这边采取第一种方式,只不过在系统升级时先将数据导出,然后删除表,再建立分区表,最后导入数据。
三、正言:分区一般有范围分区、列表分区、哈希分区和组合分区,这里我就介绍我用到的范围分区,其他三种我会在文尾贴上连接,感兴趣的朋友可以去了解学习。
A、在选用范围分区之前需要考虑几点:
1.每一个分区都有一个VALUES LESS THEN子句,它指定了一个不包括在该分区中的上限值。任一个值等于或者大于这个上限值的记录都会被加入到下一个高阶的分区中。
2.所有分区,除了第一个,都会有一个隐式的下限值,这个值就是此分区的前一个分区的上限值。
3.在最高的分区中,MAXVALUE被定义。MAXVALUE代表了一个不确定的值。这个值高于其它分区中的任何分区键的值,也可以理解为高于任何分区中指定的VALUE LESS THEN的值,同时包括空值。
B、创建分区表(需要注意VALUES LESS THAN (此值是不包括在该分区中的,会进入下一个分区,简介中有介绍)):
1.根据ID分区(设存在两百调数据,ID从1-200,分两个区,每个区100条数据)
CREATE TABLE TEST(
T_ID NUMBER NOT NULL PRIMARY KEY,
T_DATE DATE,
T_GRADE INT )
PARTITION BY RANGE (T_ID)
(
PARTITION T_1 VALUES LESS THAN (101) ,
PARTITION T_2 VALUES LESS THAN (200)
);
2.根据时间划分(设存在2018年全年的数据,在这里根据季度来分区)
CREATE TABLE TEST(
T_ID NUMBER NOT NULL PRIMARY KEY,
T_DATE DATE,
T_GRADE INT )
PARTITION BY RANGE (T_DATE)
(
PARTITION DATE_1 VALUES LESS THAN (TO_DATE('2018-04-01','yyyy-mm-dd')) ,
PARTITION DATE_1 VALUES LESS THAN (TO_DATE('2018-07-01','yyyy-mm-dd')) ,
PARTITION DATE_1 VALUES LESS THAN (TO_DATE('2018-10-01','yyyy-mm-dd')) ,
PARTITION DATE_1 VALUES LESS THAN (TO_DATE('2019-01-01','yyyy-mm-dd'))
);
3.根据最大值MAXVALUE来分区(因为本方法没有测试,有需要前往文底链接)
C、常用的分区表的维护和操作(我更喜欢博客园的那种代码排版风格,所以直接贴链接了)