通过将连续聚合刷新策略与压缩策略相结合,Timescale 允许您降采样和压缩数据块。
如果您想实现这些策略不支持的功能,您可以编写用户自定义操作来降采样和压缩数据块。以下示例将原始数据降采样为每小时数据的平均值。这是一个说明性示例,可以使用连续聚合策略更简单地完成。但是您可以使查询任意复杂。
创建一个过程,首先查询超表的数据块,以确定它们是否比
lag
参数旧。本例中的超表名为metrics
。如果数据块尚未压缩,则通过取原始数据的平均值来对其进行降采样。然后压缩它。临时表用于在计算平均值时存储数据。CREATE OR REPLACE PROCEDURE downsample_compress (job_id int, config jsonb)LANGUAGE PLPGSQLAS $$DECLARElag interval;chunk REGCLASS;tmp_name name;BEGINSELECT jsonb_object_field_text (config, 'lag')::interval INTO STRICT lag;IF lag IS NULL THENRAISE EXCEPTION 'Config must have lag';END IF;FOR chunk INSELECT show.oidFROM show_chunks('metrics', older_than => lag) SHOW (oid)INNER JOIN pg_class pgc ON pgc.oid = show.oidINNER JOIN pg_namespace pgns ON pgc.relnamespace = pgns.oidINNER JOIN timescaledb_information.chunks chunk ON chunk.chunk_name = pgc.relnameAND chunk.chunk_schema = pgns.nspnameWHERE chunk.is_compressed::bool = FALSELOOPRAISE NOTICE 'Processing chunk: %', chunk::text;-- build name for temp tableSELECT '_tmp' || relnameFROM pg_classWHERE oid = chunk INTO STRICT tmp_name;-- copy downsampled chunk data into temp tableEXECUTE format($sql$ CREATE UNLOGGED TABLE %I ASSELECT time_bucket('1h', time), device_id, avg(value) FROM %s GROUP BY 1, 2;$sql$, tmp_name, chunk);-- clear original chunkEXECUTE format('TRUNCATE %s;', chunk);-- copy downsampled data back into chunkEXECUTE format('INSERT INTO %s(time, device_id, value) SELECT * FROM %I;', chunk, tmp_name);-- drop temp tableEXECUTE format('DROP TABLE %I;', tmp_name);PERFORM compress_chunk (chunk);COMMIT;END LOOP;END$$;注册该作业以每天运行。在
config
中,将lag
设置为 12 个月,以删除包含 12 个月前数据的数据块。SELECT add_job('downsample_compress','1d', config => '{"lag":"12 month"}');
关键词
在此页面上发现问题?报告问题 或 在 GitHub 上编辑此页。