如何在 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 工作
从文档中,我看到我们可以使用 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 工作