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

标签

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


背景

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

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

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

我们可以将老化数据直接删除,也可以将老化数据删除并写入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 查询》

时间: 2024-08-25 02:59:24

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

PostgreSQL 基于行号(tid)的快速扫描

PostgreSQL 自带的表是堆表,数据按行存储在HEAP PAGE中,在btree索引中,除了存储字段的value,还会存储对应的ctid(即行号),检索记录也是通过行号进行检索的呢. 因此通过行号是可以快速检索到记录的.行号的写法是(page_number, item_number),数据块从0开始编号,行号从1开始编号. 例子 :查找0号数据块的第10条记录,走tid扫描,是非常快的,因为已经给出了page号和item号,直接定位block和item. postgres=# select

Beyond Compare输出窗格中显示行号方法

  Beyond Compare输出窗格中显示行号方法         步骤一:打开Beyond Compare软件,在主页面左侧"新建会话"目录中,选择"文本合并"会话,打开会话操作界面. 步骤二:分别单击界面两侧"打开文件"按钮,选择需要合并的源代码文件,您可以选择在独立窗口中显示文本输出窗格,如下图图例所示,默认情况下,窗格中不显示文本行号信息. Beyond Compare 步骤三:将光标停留在输出窗格的左侧任意位置,右键单击并在展开的菜

MFC线程计算可以不从函数的开始的位置,而从指定的行号开始执行么

问题描述 MFC线程计算可以不从函数的开始的位置,而从指定的行号开始执行么 MFC线程计算可以不从函数的开始的位置,而从指定的行号开始执行么,怎么根据行号来执行函数? 解决方案 给需要用到的行加上标号,自己编号,在程序开头判断,用goto跳转执行

复制代码如何处理前面的行号

网上类似的例子很多. 1.一个很懒的方法 2.文本编辑器中正则表达式替换 (一)一种情况是行号后带.   输入^[0-9]+[.] 或者输入 ([0-9][0-9])/.|[0-9]/.  (二)第二种情况是行号数字后带空格,用ultraEdit的替换功能.正则表达式 %[ 1-9][0-9]   .注意:[ 1-9]中[后有空格,[0-9]后也有空格 三.vs环境中支持块选,使用alt+鼠标拖动来实现竖向选择区块,再删除行号. 四.UtraEdit也支持块选,热键alt+c ,再使用alt+鼠

js获取table行数:js获取table中鼠标点的行号和内容

<html><head><script language="javascript">function doclick(){var td = event.srcelement; // 通过event.srcelement 获取激活事件的对象 tdalert("行号:" + (td.parentelement.rowindex + 1) + ",内容:" + td.innertext);var tab = docu

如何得到SQL Server2000的结果集中行的行号

server 如何得到SQL Server2000的结果集中行的行号

DEV GridView如何显示行号

private void gridView_CustomDrawRowIndicator(object sender, DevExpress.XtraGrid.Views.Grid.RowIndicatorCustomDrawEventArgs e) { if (e.Info.IsRowIndicator && e.RowHandle >= 0) { e.Info.DisplayText = (e.RowHandle + 1).ToString(); } } 同时在load函数中加上

Dev Treelist控件如何显示行号

欢迎使用ueditor! #region 显示行号 private void treeList1_CustomDrawNodeIndicator(object sender, DevExpress.XtraTreeList.CustomDrawNodeIndicatorEventArgs e) { DevExpress.XtraTreeList.TreeList tmpTree = sender as DevExpress.XtraTreeList.TreeList; DevExpress.Ut

Eclipse中自动激活和显示行号设置

1. 设置自动激活(auto-activation) 自动激活默认延迟500ms, 可以修改为1ms, 响应快速, 设置位置:Window->Preferences, 具体如下图: 2. 设置显示行号(show line numbers) 设置位置: Window->Preferences, 具体如下图: 作者:csdn博客 Mystra 更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/