返回

PostgreSQL数据库TimescaleDB超表分区时间修改范围

后端

TimescaleDB 是一种开源的关系型数据库,专为处理时间序列数据而设计。它可以轻松扩展到数百万个时间序列,每个时间序列包含数百万个数据点。TimescaleDB 使用分区分表的方式来管理时间序列数据,每个分区包含一定时间范围内的所有数据点。随着时间的推移,随着新数据点的加入,旧的数据点会逐渐移出当前分区,并被移动到历史分区中。

在某些情况下,您可能需要修改超表的分区时间范围。例如,您可能需要将旧数据点移动到一个新的分区中,或者您可能需要将一个分区中的数据点移动到另一个分区中。TimescaleDB 提供了修改分区时间范围的命令,您可以使用该命令轻松地完成此操作。

在使用该命令修改超表的分区时间范围之前,您需要确定要修改的超表和分区。您可以使用以下命令查看超表及其分区:

\d+ <table_name>

例如,以下命令可以查看名为 "metrics" 的超表及其分区:

\d+ metrics

输出结果如下:

              Table "public.metrics"
   Column    |            Type             | Modifiers | Storage  | Stats target | Description 
------------+-----------------------------+-----------+----------+--------------+-------------
 metric_name | text                        | not null | extended |              | 
 time        | timestamp without time zone | not null | extended |              | 
 value       | double precision            | not null | extended |              | 
 partition_id | integer                     | not null | plain    |              | 
Indexes:
    "metrics_time_idx" btree (time)

Partition key: partition_id
Partitioning: range (partition_id)

Rangepartitions:
# Partition | Table | Schema | Start | End | 
------------+-------+--------+-------+-----+
# 0        |      |        | NULL | 2022-07-29 19:59:59.999999999 |
# 1        |      |        | 2022-07-29 20:00:00 | 2022-08-05 19:59:59.999999999 |
# 2        |      |        | 2022-08-05 20:00:00 | 2022-08-12 19:59:59.999999999 |

从输出结果中,您可以看到超表 "metrics" 有三个分区,分别是 "#0"、"#1" 和 "#2"。

要修改超表的分区时间范围,您可以使用以下命令:

ALTER TABLE <table_name> SET TIMESCALEDB_PARTITIONS (partition_field <range_spec>);

其中:

  • <table_name> 是要修改的超表的名称。
  • <partition_field> 是分区字段的名称。
  • <range_spec> 是新的分区时间范围。

例如,以下命令将超表 "metrics" 的分区时间范围修改为:

ALTER TABLE metrics SET TIMESCALEDB_PARTITIONS (partition_id < 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30>);

执行此命令后,超表 "metrics" 的分区时间范围将被修改为:

# Partition | Table | Schema | Start | End | 
------------+-------+--------+-------+-----+
# 0        |      |        | NULL | 2022-07-29 19:59:59.999999999 |
# 1        |      |        | 2022-07-29 20:00:00 | 2022-08-02 19:59:59.999999999 |
# 2        |      |        | 2022-08-02 20:00:00 | 2022-08-05 19:59:59.999999999 |
# 3        |      |        | 2022-08-05 20:00:00 | 2022-08-08 19:59:59.999999999 |
# 4        |      |        | 2022-08-08 20:00:00 | 2022-08-11 19:59:59.999999999 |
# 5        |      |        | 2022-08-11 20:00:00 | 2022-08-14 19:59:59.999999999 |
# 6        |      |        | 2022-08-14 20:00:00 | 2022-08-17 19:59:59.999999999 |
# 7        |      |        | 2022-08-17 20:00:00 | 2022-08-20 19:59:59.999999999 |
# 8        |      |        | 2022-08-20 20:00:00 | 2022-08-23 19:59:59.999999999 |
# 9        |      |        | 2022-08-23 20:00:00 | 2022-08-26 19:59:59.999999999 |
# 10       |      |        | 2022-08-26 20:00:00 | 2022-08-29 19:59:59.999999999 |
# 11       |      |        | 2022-08-29 20:00:00 | 2022-09-01 19:59:59.999999999 |
# 12       |      |        | 2022-09-01 20:00:00 | 2022-09-04 19:59:59.999999999 |
# 13       |      |        | 2022-09-04 20:00:00 | 2022-09-07 19:59:59.999999999 |
# 14       |      |        | 2022-09-07 20:00:00 | 2022-09-10 19:59:59.999999999 |

这样,您就成功修改了超表 "metrics" 的分区时间范围。