Timescale Cloud:性能、规模、企业级
自托管产品
MST
Timescale 允许您通过将连续聚合刷新策略与 hypercore 结合使用,对数据块进行降采样和压缩。如果您想实现这些策略不支持的功能,您可以编写一个作业来降采样并将数据块转换为列式存储。
以下示例将原始数据降采样为每小时数据的平均值。这是一个说明性示例,使用连续聚合策略可以更简单地完成。但您可以使查询任意复杂。
创建过程以对数据块进行降采样并将其转换为列式存储
此过程首先查询超表的数据块,以确定它们是否比
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 convert_to_columnstore (chunk);COMMIT;END LOOP;END$$;注册作业以每日运行
在
config
中,将lag
设置为 12 个月,以删除包含早于 12 个月数据的数据块。SELECT add_job('downsample_compress','1d', config => '{"lag":"12 month"}');
关键词
此页面有疑问?报告问题 或 在 GitHub 上编辑此页面
。