PostgreSQL 动态分表+Rotate轮询

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: 环境配置:Windows Server 2012 & E3服务器(16G内存) & PostgreSQL 9.6

工作中,遇到如下业务需求:用户可以自定义历史数据的保存期限,且对过期数据不作保留(即定期删除),该类数据表的数量级在6千万/年。

前期处理方案:按月分表,由于在项目前期,限制用户只能保存一年的数据量,通过PG的Rule分表,并通过一张中间表,进行新月份数据的录入更替。简单Rotate用法,在月份更替零点执行即可,因DDL支持事务,可以对失败操作进行回滚。

使用Rule创建分区表的操作不再累述,因为每年有固定的12个月,举例,当前5月份数据存放在table_xxx_5表中,那么去年6月份的数据就存放在table_xxx_5表中,而去年5月份的数据,存放在table_xxx_med表中,以便查询5月剩余天数在去年的历史数据,轮询数据的方法如下:

1. 开始事务
BEGIN;
SET LOCK_TIMEOUT = '30's;
2. 查询NextMonth
SELECT EXTRACT(MON FROM NOW()) + 1;
3. 删除table_xxx_med表约束
ALTER TABLE table_xxx_med DROP CONSTRAINT IF EXISTS ck_mon;
4. 删除table_xxx_med数据
TRUNCATE table_xxx_med;
5. 重命名table_xxx_med,以便于将table_xxx_05重名为table_xxx_med
ALTER TABLE table_xxx_med RENAME TO table_xxx_med_temp;
ALTER TABLE table_xxx_05 RENAME TO table_xxx_med;
6. 添加约束,重命名表
ALTER TABLE table_xxx_med_temp ADD CONSTRAINT ck_mon CHECK ( EXTRACT ( MON FROM crt_time ) = 5 );
ALTER TABLE table_xxx_med_temp RENAME TO table_xxx_05;
7. 提交或回滚
COMMIT;
ROLLBACK;

如果对于数据查询的实时性要求很高,即不能容忍零点时事务执行存在对业务的Delay时长,那么可以再添加一张中间表,为下月数据平滑切换提供存储空间,在任意业务空闲时间点执行即可。

用户自定义数据保存期限方案:
在主表上触发器,每当有数据插入时,判断是否存在对应年份+月份的分区表,如果存在,则直接插入,如果不存在,则重新创建年份+月份分区表,并创建对应索引;对过期月份的分区表,直接DROP。

不足之处:触发器是针对EACH ROW的,在数据插入方面的性能不及Rule形式的表分区,但测试得到E3下的插入效率远大于1K/s,满足业务场景需求。

具体实现如下:

CREATE OR REPLACE FUNCTION dynamic_create_table_func () RETURNS TRIGGER AS $BODY$
DECLARE
    date_catalog TEXT;
    sql_statement TEXT;
    sql_create TEXT;
    sql_index TEXT;
BEGIN
    SELECT to_char( NEW.dp_crt, 'YY_MM' ) INTO date_catalog;
    sql_statement := 'insert into dynamic_partition_table_' || date_catalog || ' (dp_id, dp_content, dp_crt, part_x) values (nextval(''dynamic_partition_table_dp_id_seq''), $1.dp_content, $1.dp_crt, ' || to_char( NEW.dp_crt, 'YYMM' ) || ')';
    EXECUTE sql_statement USING NEW;
    RETURN NULL;
    EXCEPTION 
    WHEN UNDEFINED_TABLE THEN
    sql_create := 'create table if not exists dynamic_partition_table_' || date_catalog || ' (check(part_x = ' || to_char( NEW.dp_crt, 'YYMM' ) || ')) inherits (dynamic_partition_table);';
    EXECUTE sql_create;
    sql_index := 'create index dynamic_partition_table_' || date_catalog || '_dp_id_idx on dynamic_partition_table_' || date_catalog || '(dp_id);';
    EXECUTE sql_index;
    sql_index := 'create index dynamic_partition_table_' || date_catalog || '_dp_crt_idx on dynamic_partition_table_' || date_catalog || '(dp_crt);';
    EXECUTE sql_index;
    EXECUTE sql_statement USING NEW;
    RETURN NULL;
END;
$BODY$
LANGUAGE'plpgsql';

CREATE TRIGGER dynamic_partition_table_insert_trg BEFORE INSERT ON dynamic_partition_table FOR EACH ROW EXECUTE PROCEDURE dynamic_create_table_func ();

创建的表名格式,table_xxx_18_05。

各位前辈,晚辈初学PG不才,如有更优的方案,望不吝明示。


相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
SQL 关系型数据库 数据库
MySQL · 社区动态 · Online DDL 工具 gh-ost 支持阿里云 RDS
背景 Online DDL 一直都是 DBA 运维时比较头疼的事,一般都会选择在业务低峰期谨慎的操作,比较常用的几个工具比如 percona pt-online-schema-change , Facebook OSC, 本质上它们都是基于触发器的,简单来讲就是通过数据库的触发器把作用在源表的操作在一个事务内同步到修改后的表中,这在业务高峰期时会极大的加重主库的负载。
4571 0
|
11月前
|
SQL 存储 关系型数据库
PostgreSQL 动态表复制(CREATE TABLE AS & CREATE TABLE LIKE)
PostgreSQL 动态表复制(CREATE TABLE AS & CREATE TABLE LIKE)
|
SQL 存储 缓存
23 PostgreSQL 监控4 动态内核跟踪 stap 篇|学习笔记
快速学习23 PostgreSQL 监控4 动态内核跟踪 stap 篇
570 0
23 PostgreSQL 监控4 动态内核跟踪 stap 篇|学习笔记
|
存储 关系型数据库 MySQL
「助力降本增效」RDS发布实例暂停以及云盘性能等级动态调整功能
云数据库和IDC自建数据库一个重要的区别是弹性,IDC自建不具备或者只具备有限的弹性能力,而云能够利用IaaS资源层的能力帮助客户快速进行数据库弹性。
390 0
「助力降本增效」RDS发布实例暂停以及云盘性能等级动态调整功能
|
SQL 弹性计算 关系型数据库
|
SQL 存储 Cloud Native
阿里云新品发布会周刊第133期 丨 PolarDB企业级架构重磅发布 + 蚂蚁动态卡片解析
新产品、新版本、新技术、新功能、价格调整,评论在下方,下期更新!关注更多新品发布会!
546 0
阿里云新品发布会周刊第133期 丨 PolarDB企业级架构重磅发布  +  蚂蚁动态卡片解析
|
关系型数据库 数据库 PostgreSQL
postgresql动态赋予用户库,表权限
postgresql动态赋予用户库,表权限
438 0
postgresql动态赋予用户库,表权限
|
SQL 弹性计算 Oracle
PostgreSQL native partition 分区表性能优化之 - 动态SQL+服务端绑定变量
标签 PostgreSQL , 分区表 , native partition , 性能 , pg_pathman , plpgsql , 动态SQL , 服务端绑定变量 , prepare , execute 背景 目前PG的native partition分区性能不佳,一种解决方法是使用pg_pathman插件,另一种方法是业务上直接插分区,还有一种方法是使用UDF函数接口(函数内部使
1237 0
|
监控 关系型数据库 数据库
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 28 章 监控数据库活动_28.5. 动态追踪
28.5. 动态追踪 28.5.1. 动态追踪的编译 28.5.2. 内建探针 28.5.3. 使用探针 28.5.4. 定义新探针 PostgreSQL提供了功能来支持数据库服务器的动态追踪。
1324 0