暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

【学习笔记】超融合时序数据库Uqbar---时序数据压缩

原创 哇哈哈 2022-12-16
490

时序数据压缩

时序数据的价值密度低,对存储成本较敏感;且时序数据前后点的变化往往很小,比较易于压缩。因此,时序数据库需要支持时序数据的高压缩率。

相同数据集下,压缩率超越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. 设置自动压缩的延迟间隔为1 min:即 timeseries_compression_delay = '1 min';

  2. 插入数据建立chunk(分片),保证分片的结束时间小于当前时间,例如

    INSERT INTO weather SELECT '2022-07-01 00:00:00'::timestamp, 'beijing', 'park', generate_series(1, 2000); 

    Copy

  3. 查看chunk属性,找到建立的分片。

    SELECT * FROM timeseries_catalog.tschunk;

    Copy

  4. 两分钟以后再次查看chunk属性,确认其是否已经被压缩。

手动压缩

Uqbar支持用户手动触发压缩。当自动压缩的策略还未触发时,可以通过手动压缩命令强制触发数据压缩,以提早节省存储空间。

注意事项

  • Uqbar暂不支持分片压缩后写入数据,压缩后的分片无法执行写入操作。
  • 不指定分区时会对时序表所有的chunkgroup执行强制压缩,指定分区时会对指定的chunkgroup执行强制压缩。

语法格式

COMPRESS TIMESERIES table_name [ PARTITION chunkgroupname ]

Copy

示例

Uqbar=# COMPRESS TIMESERIES weather PARTITION chunkgroup_1;
COMPRESSED
Uqbar=# COMPRESS TIMESERIES weather;
COMPRESSED

Copy

压缩率视图

Uqbar提供压缩率视图,供用户查看时序表压缩前后的数据量、压缩率,以及表下每个chunkgroup的压缩前后数据量,压缩率。压缩率的计算方法是压缩前数据大小除以压缩后数据大小。

语法格式

SELECT * FROM timeseries_views.comression_table;
SELECT * FROM timeseries_views.compression_chunkgroup;

Copy

视图属性

参见timeseries_views.compression_tabletimeseries_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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论