Timescale Cloud:性能、规模、企业级

自托管产品

MST

超表是 PostgreSQL 表,通过按时间自动分区数据来帮助您提升插入和查询性能。每个超表都由称为“数据块”(chunk)的子表组成。每个数据块都分配有一个时间范围,并且只包含该时间范围的数据。当您运行查询时,Timescale Cloud 会识别正确的数据块并在其上运行查询,而不是遍历整个表。本页向您展示如何调整超表以进一步提升性能。

调整超表数据块间隔可以提升数据库性能。

  1. 选择最佳数据块间隔

    默认数据块间隔为 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。

  2. 检查数据块间隔的当前设置

    查询 TimescaleDB 目录以获取超表信息。例如

    SELECT *
    FROM timescaledb_information.dimensions
    WHERE 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 | | |

    基于时间间隔的长度以微秒为单位报告。

  3. 更改现有超表的数据块间隔长度

    要更改现有超表的数据块间隔,请调用 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 会使用这些范围进行动态数据块排除。

Chunk skipping

您可以在压缩为列存格式的超表上,为 smallintintbigintserialbigserialdatetimestamptimestamptz 类型的列启用数据块跳过。

您可以根据需要为任意数量的列启用数据块跳过。然而,最佳实践是为同时满足以下条件的列启用它:

  • 相关联的,即与分区列有某种关联。
  • 在查询的 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 上编辑此页面