文章

pg数据库到达梦8迁移适配-自动表分区

pg数据库到达梦8迁移适配-自动表分区

pg数据库到达梦8迁移适配-自动表分区

pg实现

pg常见的自动表分区实现有两种方式。

  • partition分区+定时任务。在pg数据库使用partition of声明分区表,使用for values from基于时间做范围分区,定义创建分区的存储过程或函数。业务上使用定时任务,定时调用存储过程或函数。
  • inherits表继承+触发器。利用pg的表继承特性,在pg数据库使用inherits关键字声明继承表。对主表定义触发器,按设定的时间规则,将数据写入对应的继承表中。

适配达梦

达梦数据库没有pg的inherits关键字,没有表继承特性。有partition关键字,但分区策略更灵活。只需使用INTERVAL关键字设置分区的频率,自动实现范围分区。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
--dm8 sql例

-- 创建分区表。
-- 对create_time字段的值,按月自动创建分区,设置负载因子,设置初始分区。分区后,达梦的分区表的表名不支持自定义
create table tb_xx (id varchar(48) not null,create_time timestamp,update_time timestamp) 
PARTITION BY RANGE 
             ( 
                          create_time 
             ) 
             INTERVAL 
             ( 
                          NUMTOYMINTERVAL (1, 'month') 
             ) 
             ( PARTITION P_BEFORE_2024 VALUES LESS THAN (TO_DATE ('2024-01-01', 'yyyy-mm-dd'))) STORAGE 
             ( 
                          FILLFACTOR 85, 
                          BRANCH(32,32) 
             );


-- 分区数据清除函数,业务上可配合定时任务使用。
-- dm不支持直接在函数里执行删除数据操作,需要声明自治事务AUTONOMOUS_TRANSACTION
CREATE OR REPLACE function func_clean_partition_for_tb_xx(p_partition_method IN int default 1, p_keep_day IN int default 90) RETURN int AS 
DECLARE PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
    delete from tb_xx where "create_time" < add_days(now(), -p_keep_day);
    commit;
    return 0;
END;
本文由作者按照 CC BY 4.0 进行授权