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

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介:

标签

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 前端开发
layui用layer.open打开子页面并获取子页面的ueditor富文本编辑器的内容
该内容描述了一个Web应用的交互流程,其中父页面通过调用子页面的JavaScript函数来获取富文本编辑器的内容。子页面包含一个富文本编辑器和一个`callbackdata`函数,用于返回编辑器的文本内容。父页面使用`layer.open`打开子页面作为弹窗,并在用户点击提交时,访问子页面的`callbackdata`获取编辑器内容,同时检查其他表单字段,如类型、标题等是否为空,以确保数据完整。
1185 0
|
搜索推荐 前端开发 JavaScript
什么是百度优化?百度SEO优化解决方案
百度优化的解决方案不仅可以帮助企业提升网站在百度PC端的收录与关键词排名,也可以获得更好的移动端收录与关键词排名,从而达到品牌SEO推广及引流的目的。接下来小编为你详细分享什么是百度优化以及实用的解决方案,一起来看看吧。
1989 0
|
9月前
|
存储 前端开发 Java
如何开发供应商管理系统中的询报价板块(附架构图+流程图+代码参考)
本文介绍了供应商管理系统中的询报价板块,涵盖创建询价需求、供应商报价、比价分析、核价等核心流程。通过系统化管理,企业可提升采购效率与透明度,优化供应商选择,降低采购成本。
|
安全 NoSQL Java
SpringBoot3整合SpringSecurity,实现自定义接口权限过滤(二)
SpringBoot3整合SpringSecurity,实现自定义接口权限过滤
1326 0
|
关系型数据库 Linux 数据库
PostgreSQL 入门指南:安装、配置与基本命令
本文从零开始,详细介绍如何在 Windows、Linux 和 macOS 上安装和配置 PostgreSQL,涵盖30+个实操代码示例。内容包括安装步骤、配置远程访问和用户权限、基础数据库操作命令(如创建表、插入和查询数据),以及常见问题的解决方案。通过学习,你将掌握 PostgreSQL 的基本使用方法,并为后续深入学习打下坚实基础。
13817 1
|
设计模式 Java 关系型数据库
设计模式:工厂方法模式(Factory Method)
工厂方法模式是一种创建型设计模式,通过将对象的创建延迟到子类实现解耦。其核心是抽象工厂声明工厂方法返回抽象产品,具体工厂重写该方法返回具体产品实例。适用于动态扩展产品类型、复杂创建逻辑和框架设计等场景,如日志记录器、数据库连接池等。优点包括符合开闭原则、解耦客户端与具体产品;缺点是可能增加类数量和复杂度。典型应用如Java集合框架、Spring BeanFactory等。
|
消息中间件 存储 NoSQL
redis实战——go-redis的使用与redis基础数据类型的使用场景(一)
本文档介绍了如何使用 Go 语言中的 `go-redis` 库操作 Redis 数据库
770 0
redis实战——go-redis的使用与redis基础数据类型的使用场景(一)
|
分布式计算 监控 Java
Java的大数据处理与分析技术 (2)
Java的大数据处理与分析技术 (2)
301 2
IEC104初学者教程,第六章:信息对象类型归总
信息对象类型(Type Identification, TI)字段用于指示报文中包含的信息对象的类型。信息对象类型字段通常是一个字节(8位),表示不同种类的数据或命令。每种类型的值代表一种特定的电力系统数据或控制指令,接收方根据此字段来解析和处理报文中的具体信息。
426 2
|
Ubuntu Linux Shell
如何编辑 sudoers 文件
如何编辑 sudoers 文件
924 1