注意

此接口自 TimescaleDB v2.13.0 起已弃用。

有关受支持的超表接口的信息,请参阅 add_dimension()

向 Timescale 超表添加额外的分区维度。选择作为维度的列可以使用间隔分区(例如,用于第二个时间分区)或哈希分区。

警告

add_dimension 命令只能在表已转换为超表(通过 create_hypertable)后执行,但同样必须仅在空超表上运行。

空间分区:强烈建议对 分布式超表 使用空间分区,以实现高效的横向扩展性能。对于仅存在于单个节点上的常规超表,额外的分区可用于特殊的用例,但不建议大多数用户使用。

空间分区使用哈希:每个不同的项都哈希到 N 个桶之一。请记住,我们已经使用(灵活的)时间间隔来管理数据块大小;空间分区的主要目的是在多个数据节点(在分布式超表的情况下)或同一时间间隔内的多个磁盘之间(在单节点部署的情况下)实现并行化。

在分布式超表中,空间分区允许跨数据节点并行插入,即使插入的行共享来自同一时间间隔的时间戳,从而提高了摄取率。查询性能也受益于能够跨节点并行查询,尤其是在可以将完整或部分聚合“下推”到数据节点时(例如,在查询 avg(temperature) FROM conditions GROUP BY hour, location 中,当使用 location 作为空间分区时)。有关更多信息,请参阅我们的关于分布式超表中分区的最佳实践

并行 I/O 在两种情况下有益:(a) 两个或多个并发查询应该能够并行地从不同的磁盘读取,或者 (b) 单个查询应该能够使用查询并行化来并行地从多个磁盘读取。

因此,寻求并行 I/O 的用户有两种选择

  1. 在多个物理磁盘上使用 RAID 设置,并将单个逻辑磁盘暴露给超表(即,通过单个表空间)。

  2. 对于每个物理磁盘,向数据库添加单独的表空间。Timescale 允许您实际上向单个超表添加多个表空间(尽管在底层,超表的数据块分布在与该超表关联的表空间中)。

我们建议在可能的情况下使用 RAID 设置,因为它支持上述两种形式的并行化(即,将单独的查询发送到单独的磁盘,将单个查询并行发送到多个磁盘)。多表空间方法仅支持前者。使用 RAID 设置,不需要空间分区

也就是说,当使用空间分区时,我们建议每个磁盘使用 1 个空间分区。

Timescale 不会从大量的空间分区中获益(例如,您在分区字段中期望的唯一项的数量)。大量此类分区会导致每个分区的负载平衡较差(使用哈希将项映射到分区),以及某些类型的查询的计划延迟大大增加。

名称类型描述
hypertableREGCLASS要向其添加维度的超表
column_nameTEXT要分区的列
名称类型描述
number_partitionsINTEGER要在 column_name 上使用的哈希分区数。必须 > 0
chunk_time_intervalINTERVAL每个数据块覆盖的时间间隔。必须 > 0
partitioning_funcREGCLASS用于计算值的分区的函数(请参阅 create_hypertable 说明
if_not_existsBOOLEAN设置为 true 以避免在列的维度已存在时抛出错误。而是发出通知。默认为 false
类型描述
dimension_idINTEGERTimescaleDB 内部目录中维度的 ID
schema_nameTEXT超表的模式名称
table_nameTEXT超表的表名
column_nameTEXT要分区的列的列名
createdBOOLEAN如果添加了维度,则为 True,如果 if_not_exists 为 true 且未添加维度,则为 false

执行此函数时,必须提供 number_partitionschunk_time_interval 之一,这决定了维度是使用哈希分区还是间隔分区。

chunk_time_interval 应按如下方式指定

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

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

警告

目前,支持多个附加维度是实验性的。对于任何生产环境,建议用户最多使用一个“空间”维度。

首先将表 conditions 转换为超表,仅对 time 列进行时间分区,然后添加一个额外的分区键,对 location 进行四个分区

SELECT create_hypertable('conditions', 'time');
SELECT add_dimension('conditions', 'location', number_partitions => 4);

将表 conditions 转换为具有时间分区和空间分区(2 个分区)的超表 time 和空间分区(2 个分区),然后添加两个额外的维度。

SELECT create_hypertable('conditions', 'time', 'location', 2);
SELECT add_dimension('conditions', 'time_received', chunk_time_interval => INTERVAL '1 day');
SELECT add_dimension('conditions', 'device_id', number_partitions => 2);
SELECT add_dimension('conditions', 'device_id', number_partitions => 2, if_not_exists => true);

现在在分布式超表的多节点示例中,集群包含一个访问节点和两个数据节点,配置访问节点以访问两个数据节点。然后,将表 conditions 转换为仅对 time 列进行时间分区的分布式超表,最后添加一个对 location 进行空间分区的维度,其中包含两个分区(作为附加数据节点的数量)。

SELECT add_data_node('dn1', host => 'dn1.example.com');
SELECT add_data_node('dn2', host => 'dn2.example.com');
SELECT create_distributed_hypertable('conditions', 'time');
SELECT add_dimension('conditions', 'location', number_partitions => 2);

关键词

在此页面上发现问题?报告问题 或 在 GitHub 上编辑此页面