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

简介:

标签

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 查询》

相关实践学习
对象存储OSS快速上手——如何使用ossbrowser
本实验是对象存储OSS入门级实验。通过本实验,用户可学会如何用对象OSS的插件,进行简单的数据存、查、删等操作。
目录
相关文章
|
搜索推荐 前端开发 JavaScript
什么是百度优化?百度SEO优化解决方案
百度优化的解决方案不仅可以帮助企业提升网站在百度PC端的收录与关键词排名,也可以获得更好的移动端收录与关键词排名,从而达到品牌SEO推广及引流的目的。接下来小编为你详细分享什么是百度优化以及实用的解决方案,一起来看看吧。
2170 0
|
12月前
|
存储 前端开发 Java
如何开发供应商管理系统中的询报价板块(附架构图+流程图+代码参考)
本文介绍了供应商管理系统中的询报价板块,涵盖创建询价需求、供应商报价、比价分析、核价等核心流程。通过系统化管理,企业可提升采购效率与透明度,优化供应商选择,降低采购成本。
|
安全 Java 物联网
一个好用的IM服务端项目 flamingo
以下是关于几个开源即时通讯(IM)服务端软件的简要概览 这些项目各有特色,适合不同需求,如安全、扩展性或特定工作流程。
|
Ubuntu Linux Shell
如何编辑 sudoers 文件
如何编辑 sudoers 文件
1204 1
|
XML Java API
Android 浅度解析:系统框架层修改,编译,推送相关操作
Android 浅度解析:系统框架层修改,编译,推送相关操作
1683 0
|
机器学习/深度学习 设计模式 人工智能
AIGC对设计行业的影响与启发:AIGC设计能替代真正的设计师吗?
AIGC技术正深刻影响设计行业,提升效率、拓宽创意边界,但无法替代设计师的创造力、审美和情感理解。Adobe国际认证成为设计师掌握AIGC技术的起点,推动行业标准化和设计师职业发展。AIGC与设计师的结合将共创设计行业的未来。
|
JSON Java 测试技术
一篇文章讲明白JGit学习
一篇文章讲明白JGit学习
1054 0
|
Java 数据库连接 数据库
Spring Boot整合MyBatis Plus集成多数据源轻松实现数据读写分离
Spring Boot整合MyBatis Plus集成多数据源轻松实现数据读写分离
1298 2
|
机器学习/深度学习 数据采集 监控
图像分类的发展历史、技术全解以及实战应用
图像分类的发展历史、技术全解以及实战应用
965 0
echarts的legend——图例样式的配置
echarts的legend——图例样式的配置
7924 0