本文已参与「新人创作礼亅活动,一起开启掘金创作之路。
postgresql数据库 TimescaleDB 定时压缩超表 删除超表(块)
在工作中 使用postgresql数据库 TimescaleDB 时序库进行存储实时数据,采集的数据量过大,提供的内存不足,因此考虑如何保存数据
TimescaleDB数据库中的超级表 TimescaleDB数据库自身带着函数就可以实现
TimescaleDB数据库所携带函数
一 .压缩 SELECT compress_chunk()
为了尽量不丢失数据,避免删除数据 我首先考虑把数据压缩,用他自带的函数 SELECT compress_chunk()
1查询时间 show_chunks()
CREATE OR REPLACE FUNCTION "hrmw"."show_chunks"("hypertable" regclass=NULL::regclass, "older_than" any=NULL::unknown, "newer_than" any=NULL::unknown)
RETURNS SETOF "pg_catalog"."regclass" AS '$libdir/timescaledb-1.7.1', 'ts_chunk_show_chunks'
LANGUAGE c STABLE
COST 1
ROWS 1000
show_shunks() 用法
select show_shunks(); --查看所有块
select show_shunks(超表名); --查看某个超表底下的所有块
SELECT show_chunks(older_than => INTERVAL '10 days', newer_than => INTERVAL '20 days');
-- 查询10天到20天的的块
来查询 180天的数据
SELECT show_chunks('超表名',older_than => INTERVAL '180 days', newer_than => INTERVAL '182 days');
2.compress_chunk()压缩函数
CREATE OR REPLACE FUNCTION "hrmw"."compress_chunk"("uncompressed_chunk" regclass, "if_not_compressed" bool=false)
RETURNS "pg_catalog"."regclass" AS '$libdir/timescaledb-1.7.1', 'ts_compress_chunk'
LANGUAGE c VOLATILE STRICT
COST 1
2.1先把超表变成可压缩
ALTER TABLE '超表名' SET (
timescaledb.compress,
timescaledb.compress_segmentby = '主键(字段名)',
timescaledb.compress_orderby = '时间字段 DESC');
2.2压缩分区
--压缩 SELECT compress_chunk();
压缩180天的数据
SELECT compress_chunk( '_timescaledb_internal._hyper_4_238_chunk');
-- SELECT compress_chunk( '_timescaledb_internal.分区名(块)');
--查询压缩后空间状态
SELECT * FROM timescaledb_information.compressed_chunk_stats;
--解压缩
SELECT decompress_chunk('_timescaledb_internal._hyper_4_26_chunk');
-- SELECT decompress_chunk('_timescaledb_internal.分区名(块)');
3.运用函数 自动压缩 180天
CREATE
OR REPLACE FUNCTION "hrmw"."target_compress_chunk" ( ) RETURNS "pg_catalog"."void" AS $BODY$ DECLARE--定义变量
t_accid VARCHAR;--变量
strSQL VARCHAR ( 1000 );
BEGIN--函数开始
t_accid := ( SELECT show_chunks ( '超表名', older_than => INTERVAL '180 days', newer_than => INTERVAL '182 days' ) );
strSQL := 'select compress_chunk(''' || t_accid || ''' ,true);';
EXECUTE strSQL;
END;--结束
$BODY$ LANGUAGE plpgsql VOLATILE COST 100
4.添加 定时任务
(每天2:30 自动压缩 180天的分区(块))
运用postgresql数据库自带的pgadmin工具创建定时任务
需添加的代码:
SET search_path TO hrmw;
select hrmw.target_compress_chunk();--执行函数target_compress_chunk()
二 删除分区
因为压缩后数据还是不少 最后只能删除数据 删除半年前的数据
批量删除 可以用 drop_chunks()函数
我比较懒 我用了自动化策略add_drop_chunks_policy()
#创建策略 只保留保留最近半年的数据(直接删除块)
SELECT add_drop_chunks_policy('conditions', INTERVAL '6 months');
select * from timescaledb_information.drop_chunks_policies;
SELECT remove_drop_chunks_policy('conditions');
每个超表只能有一个策略
字段名 描述 hypertable (REGCLASS)应用策略的超级表的名称 older_than (间隔)运行该策略时,将丢弃比此时间长得多的块 cascade (布尔值)是否在级联选项打开的情况下运行策略,这将导致依赖对象以及块被丢弃。 job_id (INTEGER)为实施drop_chunks策略而设置的后台作业的I schedule_interval (间隔)作业运行的间隔 max_runtime (间隔)后台作业调度程序在停止作业之前将允许其运行的最长时间 max_retries (整数)如果作业失败,将重试该作业的次数 retry_period (间隔)调度程序在两次失败重试之间等待的时间
blog.csdn.net/woai2437795…
到这里也基本完结了 如有问题 请留言或者私聊我
顺便说一句TimescaleDB 的资料太少了 一起来完善吧 ,谢谢