Timescale Cloud:性能、扩展、企业级
自托管产品
MST
注意
此接口自 TimescaleDB v2.13.0 起已弃用。
有关受支持的超表接口的信息,请参阅 add_dimension()。
向 Timescale 超表添加额外的分区维度。选作维度的列可以使用间隔分区(例如,用于第二个时间分区)或哈希分区。
警告
add_dimension
命令只能在表转换为超表(通过 create_hypertable
)后执行,但同样必须仅在空超表上运行。
空间分区:强烈建议为分布式超表使用空间分区,以实现高效的横向扩展性能。对于仅存在于单个节点上的常规超表,额外的分区可用于特殊用例,但不建议大多数用户使用。
空间分区使用哈希:每个不同的项都被哈希到 N 个桶中的一个。请记住,我们已经在使用(灵活的)时间间隔来管理分片大小;空间分区的主要目的是实现跨多个数据节点(在分布式超表的情况下)或在同一时间间隔内跨多个磁盘(在单节点部署的情况下)的并行化。
在分布式超表中,空间分区允许插入操作在数据节点之间并行化,即使插入的行共享相同时间间隔的时间戳,从而提高了摄取速率。查询性能也受益于能够在节点之间并行化查询,特别是当完全或部分聚合可以“下推”到数据节点时(例如,当使用 location
作为空间分区时,查询 avg(temperature) FROM conditions GROUP BY hour, 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
转换为超表,在 time
上进行时间分区,并在 location
上进行空间分区(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);
关键词