Timescale Cloud:性能、规模、企业级
自托管产品
MST
超表是 PostgreSQL 表,通过按时间自动分区数据来帮助您提升插入和查询性能。每个超表都由称为“数据块”(chunk)的子表组成。每个数据块都分配有一个时间范围,并且只包含该时间范围的数据。当您运行查询时,Timescale Cloud 会识别正确的数据块并在其上运行查询,而不是遍历整个表。本页向您展示如何调整超表以进一步提升性能。
调整超表数据块间隔可以提升数据库性能。
选择最佳数据块间隔
默认数据块间隔为 7 天。您可以在创建超表时设置自定义间隔。最佳实践是,在处理之前,一个数据块的数据应占用主内存的 25%,包括来自每个活动超表的索引。例如,如果您每天向一个具有 64 GB 内存的数据库写入大约 2 GB 数据,请将
chunk_interval
设置为 1 周。如果您在同一台机器上每天写入大约 10 GB 数据,请将时间间隔设置为 1 天。有关更多信息,请参阅时间分区的最佳实践。在以下示例中,您创建一个名为
conditions
的表,该表在time
列中存储时间值,并且其数据块以一天为chunk_interval
存储数据CREATE TABLE conditions (time TIMESTAMPTZ NOT NULL,location TEXT NOT NULL,device TEXT NOT NULL,temperature DOUBLE PRECISION NULL,humidity DOUBLE PRECISION NULL) WITH (tsdb.hypertable,tsdb.partition_column='time',tsdb.chunk_interval='1 day');如果您自托管 TimescaleDB v2.19.3 及更早版本,请创建一个PostgreSQL 关系表
,然后使用
create_hypertable
进行转换。之后,您可以通过调用ALTER TABLE
启用 hypercore。检查数据块间隔的当前设置
查询 TimescaleDB 目录以获取超表信息。例如
SELECT *FROM timescaledb_information.dimensionsWHERE hypertable_name = 'conditions';结果如下
hypertable_schema | hypertable_name | dimension_number | column_name | column_type | dimension_type | time_interval | integer_interval | integer_now_func | num_partitions-------------------+-----------------+------------------+-------------+--------------------------+----------------+---------------+------------------+------------------+----------------public | metrics | 1 | recorded | timestamp with time zone | Time | 1 day | | |基于时间间隔的长度以微秒为单位报告。
更改现有超表的数据块间隔长度
要更改现有超表的数据块间隔,请调用
set_chunk_time_interval
。SELECT set_chunk_time_interval('conditions', INTERVAL '24 hours');更新后的数据块间隔仅适用于新的数据块。这意味着设置过长的间隔可能需要很长时间才能纠正。例如,如果您将
chunk_interval
设置为 1 年并开始插入数据,则无法再缩短该年的数据块。如果需要纠正此情况,请创建一个新的超表并迁移数据。虽然数据块周转不会降低性能,但数据块创建所需的锁定时间比对已创建数据块的正常
INSERT
操作要长。这意味着如果同时创建多个数据块,事务将相互阻塞,直到第一个事务完成。
如果您使用昂贵的索引类型,例如某些 PostGIS 地理空间索引,请务必使用 chunks_detailed_size
检查数据块及其索引的总大小。
超表的主要目的之一是使分析查询以尽可能低的延迟运行。当您在超表上执行查询时,您不需要解析整个表;您只需访问满足查询所需的数据块。当查询的 WHERE
子句使用超表分区所依据的列时,这种方法效果很好。例如,在一个一年中每天都是一个单独数据块的超表中,查询 9 月 1 日的数据将只访问当天的数据块。
然而,许多查询使用分区列以外的列。例如,一家卫星公司可能有一个包含两列的表:一列用于卫星收集数据的时间,另一列用于数据添加到数据库的时间。如果按收集日期进行分区,则按添加日期进行的查询将访问超表中的所有数据块,从而降低性能。
为了提升查询性能,TimescaleDB 允许您在超表中跳过非分区列上的数据块。
重要提示
数据块跳过功能仅在您启用 enable_chunk_skipping
之后,对转换为列存格式的数据块生效。
您可以在超表的列上启用数据块跳过。TimescaleDB 会跟踪每个数据块中该列的最小值和最大值。这些范围以起始(包含)和结束(不包含)的格式存储在 chunk_column_stats
目录表中。当 SQL 查询的 WHERE
子句指定列上的范围时,TimescaleDB 会使用这些范围进行动态数据块排除。

您可以在压缩为列存格式的超表上,为 smallint
、int
、bigint
、serial
、bigserial
、date
、timestamp
或 timestamptz
类型的列启用数据块跳过。
您可以根据需要为任意数量的列启用数据块跳过。然而,最佳实践是为同时满足以下条件的列启用它:
- 相关联的,即与分区列有某种关联。
- 在查询的
WHERE
子句中被引用的。
在卫星示例中,数据添加到数据库的时间不可避免地晚于数据收集的时间。两个实体的顺序 ID 和创建时间戳也会同步增长。这意味着这两列是相关联的。
要更深入地了解数据块跳过,请参阅我们的博客文章。
要在列上启用数据块跳过,请在超表上针对 column_name
调用 enable_chunk_skipping
。例如,以下查询在 orders
表的 order_id
列上启用了数据块跳过
SELECT enable_chunk_skipping('orders', 'order_id');
有关如何实现数据块跳过的更多详细信息,请参阅API 参考。
您可以使用 PostgreSQL ANALYZE
命令查询超表中的所有数据块。ANALYZE
命令收集的统计信息被 PostgreSQL 优化器用于创建最佳查询计划。有关 ANALYZE
命令的更多信息,请参阅PostgreSQL 文档。
关键词
本页有任何问题?报告问题 或 在 GitHub 上编辑此页面
。