首页 > 解决方案 > Timescaledb 压缩、segmentby 和分块

问题描述

timescaledb中的设置是否segementby col确保它将为 col 的每个不同值创建一个新块?这在文档中有所暗示,但在任何地方都没有明确说明。

例如,使用文档中的示例将如下segmentby deviceid

time    device_id   cpu disk_io energy_consumption
[12:00:02, 12:00:01]    1   [88.2, 88.6]    [20, 25]    [0.8, 0.85]
[12:00:02, 12:00:01]    2   [300.5, 299.1]  [30, 40]    [0.9, 0.95]

这是否会在给定的时间范围内创建 2 个单独的块?这很重要,因为无法写入/更新压缩块,因此如果在同一时间范围内稍后出现新的设备 ID 数据点以供摄取,这会是一个问题吗?

标签: timescaledb

解决方案


压缩的超表以与原始超表相同的方式进行分块。压缩应用于每个块,并为每个原始块创建一个压缩块。

segmentby指定如何组合或分组行以进行压缩。列的每个唯一值都会segmentby在压缩块中产生一条记录,其中所有其他列的值都被压缩在一起。

segmentby在问题示例中,列device_id:1和中有两个唯一值2。然后将其他列中的对应值组合在一起并压缩。因此,在示例中,有两行 fordevice_id = 1和两行 for device_id = 2。如果所有四个原始记录都存储在原始超表的同一个块中,则两个对应的压缩记录将存储在一个压缩块中。

这很重要,因为无法写入/更新压缩块,因此如果在同一时间范围内稍后出现新的设备 ID 数据点以供摄取,这会是一个问题吗?

不支持对压缩的原始块进行任何更改。因此插入具有新segmentby值的数据将失败并出现错误。

更新:要更新压缩块中的数据,例如回填数据,必须手动解压缩块,更新数据,然后按照解压块文档中的说明将数据压缩回去。


推荐阅读