如何根据行号高效率的清除过期数据 - 非分区表,数据老化实践

简介:

标签

PostgreSQL , 数据老化 , 数据过期 , 行号 , array in , oss外部表


背景

数据按时间维度老化,删除或转移,是很多业务都有的需求。

例如业务的FEED数据,CDN的日志数据,物联网的跟踪数据等,有时间维度,可能再有状态值(标记最终状态)。

阿里云RDS PG, HDB PG都对接了OSS存储,可以在OSS中存储冷数据。

pic

我们可以将老化数据直接删除,也可以将老化数据删除并写入OSS外部表。

而假如我们的表是按老化字段分区的,那么我们可以通过DROP 分区表的方式来老化。

按分区老化

postgres=# create table t_range(id int, info text, crt_time timestamp) partition by range (crt_time);    
CREATE TABLE    

分区

postgres=# create table t_range_0_201610 partition of t_range (id  primary key, info , crt_time ) for values from ('2016-10-01') to ('2016-11-01');  -- >= 20161001 and < 20161101    
CREATE TABLE    
postgres=# create table t_range_0_201611 partition of t_range (id  primary key, info , crt_time ) for values from ('2016-11-01') to ('2016-12-01');  -- >= 20161101 and < 20161201    
CREATE TABLE    

按分区老化

postgres=# drop table t_range_0_201610;  
DROP TABLE  

按分区老化并转换为oss表

1、创建OSS外部表  
  
create foreign table ft_xxx ..... ;  
https://help.aliyun.com/knowledge_detail/43352.html  
  
2、将需要老化的数据写入外部表  
  
insert into ft_xxx select * from 老化分区;  
  
3、修改外部表的约束(指定老化分区的时间区间)  
  
alter foreign table ft_xxx add constraint ck1 check(xx between x and x);  
  
4、将外部表挂到主表下面继承(可选,如果业务还需要直接查询)  
  
alter foreign table inherit 父表;  
  
5、删掉老化分区  
  
drop table t_range_0_201610;  

按字段老化

按老化字段来老化,指表没有分区时,通过DELETE语句来老化。

创建测试表,假设STATE字段用来标记记录的最终状态,只有达到最终状态,并且时间大于老化时间的记录可以被老化。

create table tbl (id int , info text, state int, crt_time timestamp);  

创建索引

create index idx_tbl_1 on tbl (crt_time) where state=?;  

一次老化N条数据

delete from tbl where ctid = any (  
array  
  (  
  select ctid from tbl where crt_time < ? and state=? order by crt_time limit 1000000  -- 一次老化100万条  
  )  
);  
  
vacuum tbl;  

一次老化N条数据,并迁移到OSS外部表

使用CTE语法,删除并写入。

with tmp as (  
delete from tbl where ctid = any (  
array  
  (  
  select ctid from tbl where crt_time < ? and state=? order by crt_time limit 1000000  -- 一次老化100万条  
  )  
) returning *  
)  
insert into oss外部表 select * from tmp;  
  
vacuum tbl;  

老化速度,一亿记录,老化100万条,约380毫秒。

调度

《PostgreSQL 定时任务方法2》

《PostgreSQL Oracle 兼容性之 - DBMS_JOBS - Daily Maintenance - Timing Tasks(pgagent)》

参考

《随机记录并发查询与更新(转移、删除)的"无耻"优化方法》

《HTAP数据库 PostgreSQL 场景与性能测试之 25 - (OLTP) IN , EXISTS 查询》

相关实践学习
通义万相文本绘图与人像美化
本解决方案展示了如何利用自研的通义万相AIGC技术在Web服务中实现先进的图像生成。
目录
相关文章
|
安全 NoSQL Java
SpringBoot3整合SpringSecurity,实现自定义接口权限过滤(二)
SpringBoot3整合SpringSecurity,实现自定义接口权限过滤
1261 0
|
9月前
|
关系型数据库 Linux 数据库
PostgreSQL 入门指南:安装、配置与基本命令
本文从零开始,详细介绍如何在 Windows、Linux 和 macOS 上安装和配置 PostgreSQL,涵盖30+个实操代码示例。内容包括安装步骤、配置远程访问和用户权限、基础数据库操作命令(如创建表、插入和查询数据),以及常见问题的解决方案。通过学习,你将掌握 PostgreSQL 的基本使用方法,并为后续深入学习打下坚实基础。
10797 1
|
9月前
|
设计模式 Java 关系型数据库
设计模式:工厂方法模式(Factory Method)
工厂方法模式是一种创建型设计模式,通过将对象的创建延迟到子类实现解耦。其核心是抽象工厂声明工厂方法返回抽象产品,具体工厂重写该方法返回具体产品实例。适用于动态扩展产品类型、复杂创建逻辑和框架设计等场景,如日志记录器、数据库连接池等。优点包括符合开闭原则、解耦客户端与具体产品;缺点是可能增加类数量和复杂度。典型应用如Java集合框架、Spring BeanFactory等。
|
Ubuntu Linux Shell
如何编辑 sudoers 文件
如何编辑 sudoers 文件
490 1
|
消息中间件 存储 NoSQL
redis实战——go-redis的使用与redis基础数据类型的使用场景(一)
本文档介绍了如何使用 Go 语言中的 `go-redis` 库操作 Redis 数据库
622 0
redis实战——go-redis的使用与redis基础数据类型的使用场景(一)
|
安全 网络安全 Windows
你还在使用xshell绿色破解版?
你还在使用xshell绿色破解版?
12002 1
|
分布式计算 监控 Java
Java的大数据处理与分析技术 (2)
Java的大数据处理与分析技术 (2)
221 2
|
存储 关系型数据库 Java
postgresql清理表空间
postgresql清理表空间
616 0
|
XML Java API
Android 浅度解析:系统框架层修改,编译,推送相关操作
Android 浅度解析:系统框架层修改,编译,推送相关操作
1023 0
|
安全 Java 物联网
一个好用的IM服务端项目 flamingo
以下是关于几个开源即时通讯(IM)服务端软件的简要概览 这些项目各有特色,适合不同需求,如安全、扩展性或特定工作流程。