postgresql 如何在TimeScale DB中使用'partitioning_func'

a6b3iqyw  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(3)|浏览(132)

从文档中,我看到我们可以使用partitioning_func定义一个自定义的空间分区函数。然而,我没有找到任何关于如何定义分区函数以及它应该返回什么的实际例子。
我读到的是,默认情况下它使用INT 32_MAX(哈希表中的键范围),例如,如果我们给予number_partitions=2,那么数值<INT 32_MAX/2将落入第一个分区,其余值将落入第二个分区。
在我的例子中,假设我在空间分区列中有很少的不同值,那么根据默认的哈希函数,很明显所有的值都落在第一个分区中。但是,我希望每个不同的值都在不同的分区中。

lsmd5eda

lsmd5eda1#

您可以使用add_dimension向TimescaleDB Hypertable添加多个维度。
空间分区的主要目的是在同一时间间隔内实现跨多个数据节点(在分布式超表的情况下)或跨多个磁盘的并行化。
有一些警告,包括:

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

在文档中有更多关于用法的细节,但这可能是你要找的。

  • 披露:我为时间尺度工作 *
yks3o0rb

yks3o0rb2#

我想出了一个解决方案,如果我在空间分区列中有2个不同的值,我想把每个值放在一个单独的分区中(这意味着我有2个分区)。
正如我在我的问题中提到的,timescale似乎在c语言中使用INT32_MAX。其中INT32_MAX的值是2147483647,所以我将其除以2,以指导timescale根据我的空间分区值(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;

字符串
我不确定这是否是一个好的方法,让我知道你是否有更好的方法。

chy5wohz

chy5wohz3#

我相信这可能会起作用:
如果你想让我们说100租户/分区,并使用smallint从0到99计数。因为2147483647/100 = 21474836,函数看起来像这样:

CREATE OR REPLACE FUNCTION SinglePartition(tenant anyelement) RETURNS 
integer AS 
$$
BEGIN
 RETURN tenant::smallint * 21474836 + 1;
END;
$$ 
LANGUAGE plpgsql IMMUTABLE;

字符串

相关问题