注意

维度构建器在 TimescaleDB 2.13 中引入。

create_hypertableadd_dimension 与维度构建器一起使用,用于指定对超表进行分区的分区维度。

TimescaleDB 目前支持两种分区类型:按范围分区和按哈希分区。

提示

对于不兼容的数据类型(例如,jsonb),可以在维度构建的 partition_func 参数中指定一个函数以提取兼容的数据类型。请参阅下面的示例部分。

可以为范围分区和哈希分区指定自定义分区函数。分区函数应该以 anyelement 作为唯一的参数,并返回一个正的 integer 哈希值。请注意,此哈希值 *不是* 分区标识符,而是插入值的维度键空间中的位置,然后将其划分为各个分区。

如果未指定自定义分区函数,则使用默认的分区函数,该函数调用 PostgreSQL 的内部哈希函数来获取给定类型。因此,自定义分区函数可用于没有本地 PostgreSQL 哈希函数的值类型。

创建一个按范围的维度构建器,可与 create_hypertableadd_dimension 一起使用。

名称类型描述
column_name名称要分区列的名称。
名称类型描述
partition_intervalANYELEMENT对列进行分区的间隔。
partition_funcREGPROC用于计算值分区的功能。

一个维度构建器,它是一种不透明的类型 _timescaledb_internal.dimension_info,包含维度信息。

partition_interval 应按如下方式指定

  • 如果要分区的列是 TIMESTAMPTIMESTAMPTZDATE,则此长度应指定为 INTERVAL 类型或以微秒为单位的整数值。

  • 如果列是其他整数类型,则此长度应为一个整数,该整数反映列的底层语义(例如,如果此列是自 UNIX 纪元以来的毫秒数,则 partition_interval 应以毫秒为单位给出)。

下表总结了分区类型和根据列类型确定的默认值的摘要。

列类型分区类型默认值
TIMESTAMP WITHOUT TIMEZONEINTERVAL/INTEGER1 周
TIMESTAMP WITH TIMEZONEINTERVAL/INTEGER1 周
DATEINTERVAL/INTEGER1 周
SMALLINTSMALLINT10000
INTINT100000
BIGINTBIGINT1000000

最简单的用法是对时间列进行分区

SELECT create_hypertable('my_table', by_range('time'));

在这种情况下,可以排除维度构建器,因为 create_hypertable 默认情况下假定单个提供的列是按时间范围进行分区的。

如果您的表中包含非时间列,其中包含时间(例如 JSON 列),则可以添加分区函数来提取时间。

CREATE TABLE my_table (
metric_id serial not null,
data jsonb,
);
CREATE FUNCTION get_time(jsonb) RETURNS timestamptz AS $$
SELECT ($1->>'time')::timestamptz
$$ LANGUAGE sql IMMUTABLE;
SELECT create_hypertable('my_table', by_range('data', '1 day', 'get_time'));
名称类型描述
column_name名称要分区列的名称。
number_partitionsINTEGER数量[哈希分区][]用于 partitioning_column。必须大于 0。
名称类型描述
partition_funcREGPROC用于计算值分区的功能。

一个维度构建器,它是一种不透明的类型 _timescaledb_internal.dimension_info,包含维度信息。

在这个页面上发现问题了吗?报告问题 或者 在 GitHub 上编辑此页面