如何在 TimeScaleDB 中使用 'partitioning_func'

How to use 'partitioning_func' in TimeScale DB

从文档中,我看到我们可以使用 partitioning_func 定义自定义 space 分区函数。但是,我没有找到任何关于如何定义分区函数以及应该定义什么的实例 return。

我读到的是,默认情况下它使用 INT32_MAX(散列中的键范围 table),例如,如果我们给 number_partitions=2 那么数值 < INT32_MAX/2将落入第一个分区,其余值将落入第二个分区。

在我的例子中,假设我在 space 分区列中只有很少的不同值,那么根据默认的散列函数,很明显所有值都属于第一个分区。但是,我希望每个不同的值都在不同的分区中。

我想出了一个解决方案,如果我在 space 分区列中有 2 个不同的值,我想将每个值放在一个单独的分区中(这意味着我有 2 个分区)。

正如我在问题中提到的,timescale 似乎在 c 语言中使用 INT32_MAX。其中 INT32_MAX 值为 2147483647 所以我将其除以二以根据我的 space 分区值(1 或 2)指示时间刻度使用 2 个不同的分区。

下面的代码对我有用。我正在使用 Postgres 12 和 TimeScale 2.3.1

CREATE OR REPLACE FUNCTION two_partition_fun(i anyelement) RETURNS integer AS $$
        BEGIN
                RETURN 1073741821 + i;
        END;
$$ LANGUAGE plpgsql IMMUTABLE;

我不确定这是否是一个好方法,如果您有更好的方法请告诉我。

您可以使用 add_dimension 向 TimescaleDB 超表添加多个维度。

space 分区的主要目的是在同一时间间隔内实现跨多个数据节点(在分布式超表的情况下)或跨多个磁盘的并行化。

有一些注意事项包括:

  • 超表需要为空
  • 它可能适用于分布式超表,但对于单节点超表,add_dimension 的用例/需求相对有限
  • 您应该考虑添加一个以上的附加维度以进行实验,而不是在生产中使用多个附加维度。

文档中有更多关于用法的详细信息,但这可能正是您要查找的内容。

披露:我为 Timescale 工作