好的技术是需要共享的,informix数据库在2010年发版的11.7引进了间隔分区技术来实现分区的自动扩展。Oracle数据库在2017年发版的12.2同样引入了间隔分区技术来分区自动扩展。GBase8s继承于informix,自动分区这么好的东西也一并继承了。
所谓间隔分区,是指分区数据是基于一个间隔值,比如,一个分区是基于一个月,一年或几百万顾客的记录。数据表有一个最初的分区,它是基于一个range语句来定义的。当一条记录不能满足最初的分区时,数据库将会自动创建一个分区来存储这条记录,数据库表和索引都可以用这种策略来进行分区。
举例:
创建一张订单表,根据order_date自动分区,定义的分区间隔是1个月。
Oracle间隔分区语法:
create table order (order_num number not null, order_date date )PARTITION BY RANGE (order_date) INTERVAL (NUMTODSINTERVAL(1, 'MONTH')) ( PARTITION p1 VALUES LESS THAN (TO_DATE('2024-02-01, 'YYYY-MM-DD')) ); |
gbase8s间隔分区语法:
create table order (order_num integer not null, order_date date )fragment by RANGE(order_date) interval(NUMTOYMINTERVAL(1,'MONTH')) partition p1 VALUES<'2024-02-01' in datadbs1; |
两者异曲同工。
###############################################
重点说一下gbase8s的间隔分区技术:
1. 并发执行:
所有分区表放在一个数据空间中,在并行访问的时候磁盘IO可能会成为瓶颈,降低了并发度。可以定义多个数据空间存放分区表,增加表检索并行度。语法实现:store in (datadbs1, datadbs2, datadbs3, datadbs4) ;
2. 定义空值分区:
对于分区字段为空值的情况,如果不定义空值分区,在插入的时候会报错。通过VALUES IS NULL来定义空值分区。
create table order ( order_num integer not null, order_date datetime year to fraction(5) )fragment by RANGE(order_date) interval(NUMTOYMINTERVAL(1,'MONTH')) store in (datadbs1,datadbs2,datadbs3) partition p0 VALUES is null in datadbs1, partition p1 VALUES<'2024-02-01' in datadbs1, partition p2 VALUES<'2024-03-01' in datadbs2, partition p3 values <'2024-04-01' in datadbs3; |
3.1清除策略:
某些场景,为了控制生产环境分区表的大小,需要定期清理历史分区,将历史数据移除到备份库或清除。Gbase8s库提供了分区自动清除策略,三种实现方法:
1.根据分区数量的多少进行限制,比如超过100个分区,就会自动清除最早建立的分区。语法: ROLLING ( 100 FRAGMENTS )
2.根据分区表占用磁盘空间大小进行限制,比如分区表超过100G,就会自动清除最早建立的分区。语法:LIMIT TO 100000MiB DETACH ANY
3.上面两种策略都写上,有一个满足条件,就开始清理。
3.2清除方式:卸载还是删除
清除策略分两种:
1.DETACH,将历史分区从分区表中卸载下来,以单独的表存放;
2.DISCARD,将历史分区直接删除;
CREATE TABLE employee (emp_id INTEGER, emp_name CHAR(64), ssn CHAR(12), basepay FLOAT, varpay FLOAT, dept_id SMALLINT, hire_date DATE) FRAGMENT BY RANGE(emp_id) INTERVAL(1000) ROLLING ( 100 FRAGMENTS ) LIMIT TO 100000MiB DETACH STORE IN (dbs1, dbs2, dbs3) PARTITION p1 VALUES < 5000 IN dbs0, PARTITION p2 VALUES < 10000 IN dbs0, PARTITION p3 VALUES < 20000 IN dbs4; |
3.3清除动作执行时间:
清除动作并不是满足条件后马上执行,而是有自己的定时计划,默认会在每天00:45执行清除。
当然如果磁盘空间紧张,也可以手动执行清除。执行清除函数:execute function syspurge(); 就可以马上开始清除动作。




