注意
此接口自 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 的用户有两种选择
在多个物理磁盘上使用 RAID 设置,并将单个逻辑磁盘暴露给超表(即,通过单个表空间)。
对于每个物理磁盘,向数据库添加单独的表空间。Timescale 允许您实际上向单个超表添加多个表空间(尽管在底层,超表的数据块分布在与该超表关联的表空间中)。
我们建议在可能的情况下使用 RAID 设置,因为它支持上述两种形式的并行化(即,将单独的查询发送到单独的磁盘,将单个查询并行发送到多个磁盘)。多表空间方法仅支持前者。使用 RAID 设置,不需要空间分区。
也就是说,当使用空间分区时,我们建议每个磁盘使用 1 个空间分区。
Timescale 不会从大量的空间分区中获益(例如,您在分区字段中期望的唯一项的数量)。大量此类分区会导致每个分区的负载平衡较差(使用哈希将项映射到分区),以及某些类型的查询的计划延迟大大增加。
名称 | 类型 | 描述 |
---|---|---|
hypertable | REGCLASS | 要向其添加维度的超表 |
column_name | TEXT | 要分区的列 |
名称 | 类型 | 描述 |
---|---|---|
number_partitions | INTEGER | 要在 column_name 上使用的哈希分区数。必须 > 0 |
chunk_time_interval | INTERVAL | 每个数据块覆盖的时间间隔。必须 > 0 |
partitioning_func | REGCLASS | 用于计算值的分区的函数(请参阅 create_hypertable 说明) |
if_not_exists | BOOLEAN | 设置为 true 以避免在列的维度已存在时抛出错误。而是发出通知。默认为 false |
列 | 类型 | 描述 |
---|---|---|
dimension_id | INTEGER | TimescaleDB 内部目录中维度的 ID |
schema_name | TEXT | 超表的模式名称 |
table_name | TEXT | 超表的表名 |
column_name | TEXT | 要分区的列的列名 |
created | BOOLEAN | 如果添加了维度,则为 True,如果 if_not_exists 为 true 且未添加维度,则为 false |
执行此函数时,必须提供 number_partitions
或 chunk_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 上编辑此页面。