时序数据压缩
时序数据的价值密度低,对存储成本较敏感;且时序数据前后点的变化往往很小,比较易于压缩。因此,时序数据库需要支持时序数据的高压缩率。
相同数据集下,压缩率超越TimescaleDB至少20%。
压缩方式
Uqbar支持自动压缩和手动压缩两种方式。
自动压缩
系统会按照设定的压缩延迟时间,自动对时序数据执行行存转列存操作,列存数据存储时会对数据进行压缩,以节省存储空间。
压缩延迟时间可通过修改配置文件中的GUC参数uqbar.timeseries_compression_delay设置。该参数为实例级GUC参数,只可以由管理员修改,修改完成后执行reload参数生效。
注意事项
- 压缩以分片组(ChunkGroup)为粒度进行,即一个ChunkGroup内的所有chunk一起执行压缩操作。如果有一个chunk执行转列失败或者不满足转列的条件,不执行本次压缩,ChunkGroup内所有chunk保持为行存。
- 当达到设置的自动压缩间隔后,执行数据压缩还需要ChunkGroup内的chunk满足以下条件才可执行自动压缩:
- chunk所属的ChunkGroup的结束时间早于数据库系统当前时间。
- 上次触发压缩以来ChunkGroup超过一个uqbar.timeseries_compression_delay的间隔没有数据写入。
- uqbar.timeseries_compression_delay是正整数类型,单位为秒,默认值为7200。
- 由于当前openGauss后台job触发机制的限制,设置的值小于0.1s时,触发的间隔不会精确到实际设置的值。后台job触发的间隔最小为0.1s。
- 压缩成功后的ChunkGroup不支持写入数据。
示例
假设前置条件:chunkGroupDuration = 1 week,假设当前时间为2022-7-7 09:55:00
设置自动压缩的延迟间隔为1 min:即 timeseries_compression_delay = '1 min';
插入数据建立chunk(分片),保证分片的结束时间小于当前时间,例如
INSERT INTO weather SELECT '2022-07-01 00:00:00'::timestamp, 'beijing', 'park', generate_series(1, 2000);Copy
查看chunk属性,找到建立的分片。
SELECT * FROM timeseries_catalog.tschunk;Copy
两分钟以后再次查看chunk属性,确认其是否已经被压缩。
手动压缩
Uqbar支持用户手动触发压缩。当自动压缩的策略还未触发时,可以通过手动压缩命令强制触发数据压缩,以提早节省存储空间。
注意事项
- Uqbar暂不支持分片压缩后写入数据,压缩后的分片无法执行写入操作。
- 不指定分区时会对时序表所有的chunkgroup执行强制压缩,指定分区时会对指定的chunkgroup执行强制压缩。
语法格式
COMPRESS TIMESERIES table_name [ PARTITION chunkgroupname ]Copy
示例
Uqbar=# COMPRESS TIMESERIES weather PARTITION chunkgroup_1;
COMPRESSED
Uqbar=# COMPRESS TIMESERIES weather;
COMPRESSEDCopy
压缩率视图
Uqbar提供压缩率视图,供用户查看时序表压缩前后的数据量、压缩率,以及表下每个chunkgroup的压缩前后数据量,压缩率。压缩率的计算方法是压缩前数据大小除以压缩后数据大小。
语法格式
SELECT * FROM timeseries_views.comression_table;
SELECT * FROM timeseries_views.compression_chunkgroup;Copy
视图属性
参见timeseries_views.compression_table、timeseries_views.compression_chunkgroup。
示例
--查看时序表weather的压缩率
Uqbar=# SELECT tablename, before_compression_size, after_compression_size, compression_rate FROM timeseries_views.compression_table WHERE tablename = 'weather';
tablename | before_compression_size | after_compression_size | compression_ratio
--------------+--------------------------------+------------------------------+----------------------
weather | 1746534 | 1483457 | 1.17
(1 rows)
--查看时序表weather的分片压缩率
Uqbar=# SELECT tablename, chunkname, before_compression_size, after_compression_size, compression_rate FROM timeseries_views.compression_tables WHERE tablename = 'weather';
tablename | chunkname | before_compression_size | after_compression_size | compression_rate
--------------+----------------+-------------------------------+------------------------------+----------------------
weather | p_1_1 | 387564 | 328576 | 1.17
weather | p_1_2 | 417829 | 358273 | 1.16
(2 rows)「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




