超表是 PostgreSQL 表,它们会根据时间自动对您的数据进行分区。您可以像操作常规 PostgreSQL 表一样操作超表,但它具有额外功能,可以使您更轻松地管理时间序列数据。

在 Timescale 中,超表与常规 PostgreSQL 表并存。使用超表存储时间序列数据。这将为您带来改进的插入和查询性能,以及访问有用的时间序列功能。使用常规 PostgreSQL 表存储其他关系数据。

使用超表,Timescale 通过在时间参数上对时间序列数据进行分区,可以轻松提高插入和查询性能。在后台,数据库会完成设置和维护超表分区的工作。同时,您可以像所有数据都存储在单个常规 PostgreSQL 表中一样插入和查询数据。

创建和使用超表时,它会根据时间自动对数据进行分区,也可以根据空间进行分区。

每个超表都由称为块的子表组成。每个块都分配有一个时间范围,并且只包含该范围内的數據。如果超表也根据空间进行分区,则每个块也会分配一组空间值。

注意

创建块时,其创建时间会存储在目录元数据中。此块创建时间不应与块包含的数据的分区范围混淆。某些功能可能会在有意义的情况下使用此块创建时间元数据。

超表的每个块只包含来自特定时间范围的数据。当您插入来自尚未有块的时间范围的数据时,Timescale 会自动创建块来存储这些数据。

默认情况下,每个块覆盖 7 天。您可以更改此设置以更好地满足您的需求。例如,如果将 chunk_time_interval 设置为 1 天,则每个块会存储来自同一天的数据。来自不同日期的数据会存储在不同的块中。

A normal table compared to a hypertable. The normal table holds data for 3 different days in one container. The hypertable contains 3 containers, called chunks, each of which holds data for a separate day.
注意

Timescale 会根据 chunk_time_interval 将时间划分为潜在的块范围。如果数据存在于潜在的块范围内,则会创建该块。

实际上,这意味着最早块的开始时间不一定等于超表中的最早时间戳。相反,最早时间戳与开始时间之间可能存在时间间隔。这不会影响您与超表的常规交互,但可能会影响您在检查超表时看到的块数量。

块大小会影响插入和查询性能。您希望块足够小以适合内存。这使您可以在不从磁盘读取数据的情况下插入和查询最近数据。但您不希望有太多小的、稀疏填充的块。这可能会影响查询规划时间和压缩。

我们建议设置 chunk_time_interval,以便 25% 的主内存可以存储来自每个活动超表的单个块及其索引。您可以根据数据速率估算所需的间隔。例如,如果您每天写入大约 2 GB 的数据,并且有 64 GB 的内存,则将间隔设置为 1 周。如果您每天在同一台机器上写入大约 10 GB 的数据,则将时间间隔设置为 1 天。

注意

如果您使用昂贵的索引类型,例如某些 PostGIS 空间索引,请务必检查块及其索引的总大小。您可以使用 chunks_detailed_size 函数来执行此操作。

有关如何优化块大小的详细分析,请参阅 有关块时间间隔的博客文章。要了解如何查看和设置块时间间隔,请参阅有关 更改超表块时间间隔 的部分。

默认情况下,在创建超表时会自动创建索引。您可以通过将 create_default_indexes 选项设置为 false 来阻止创建索引。

默认索引为

  • 在所有超表上,对时间的索引,降序
  • 在具有空间分区的超表上,对空间参数和时间的索引

超表对唯一约束和索引有一些限制。如果您希望在超表上创建唯一索引,则该索引必须包含表的所有分区列。要了解详细信息,请参阅有关 在超表上创建唯一索引 的部分。

您可以使用 PostgreSQL ANALYZE 命令来查询超表中的所有块。ANALYZE 命令收集的统计信息将被 PostgreSQL 规划器用于创建最佳查询计划。有关 ANALYZE 命令的更多信息,请参阅 PostgreSQL 文档

关键词

在此页面上发现问题?报告问题 或 在 GitHub 上编辑此页面