超表是 PostgreSQL 表,可以按时间自动对数据进行分区。 您与超表的交互方式与常规 PostgreSQL 表相同,但具有额外的功能,可以更轻松地管理时序数据。
在 Timescale 中,超表与常规 PostgreSQL 表并存。 使用超表来存储时序数据。 这为您提供了改进的插入和查询性能,并可以访问有用的时序功能。 对于其他关系数据,请使用常规 PostgreSQL 表。
借助超表,Timescale 可以通过按时间参数对时序数据进行分区,从而轻松提高插入和查询性能。 在幕后,数据库执行设置和维护超表分区的任务。 同时,您可以像数据都存储在单个常规 PostgreSQL 表中一样插入和查询数据。
注意
超表不支持继承,可能会导致意外行为。
当您创建和使用超表时,它会自动按时间和可选的空间对数据进行分区。
每个超表都由称为数据块的子表组成。 每个数据块都分配有一个时间范围,并且仅包含该范围内的数据。 如果超表也按空间分区,则每个数据块还会分配空间值的子集。
注意
当创建数据块时,其创建时间将存储在目录元数据中。 此数据块创建时间不应与数据块包含的数据的分区范围混淆。 某些功能可以在有意义的情况下使用此数据块创建时间元数据。
超表的每个数据块仅保存特定时间范围内的数据。 当您插入来自尚无数据块的时间范围的数据时,Timescale 会自动创建一个数据块来存储它。
默认情况下,每个数据块覆盖 7 天。 您可以更改此设置以更好地满足您的需求。 例如,如果您将 chunk_time_interval
设置为 1 天,则每个数据块存储同一天的数据。 来自不同天的数据存储在不同的数据块中。

注意
Timescale 根据 chunk_time_interval
将时间划分为潜在的数据块范围。 如果存在潜在数据块范围的数据,则会创建该数据块。
实际上,这意味着您的最早数据块的开始时间不一定等于超表中的最早时间戳。 相反,开始时间和最早时间戳之间可能存在时间间隔。 这不会影响您与超表的通常交互,但可能会影响您在检查超表时看到的数据块数量。
数据块大小会影响插入和查询性能。 您希望数据块足够小以放入内存,以便您可以在不从磁盘读取的情况下插入和查询最近的数据。 但是,拥有太多小而稀疏填充的数据块可能会影响查询计划时间和压缩。
最佳实践是将 chunk_time_interval
设置为在处理之前,一个数据块的数据占用主内存的 25%,包括每个活动超表的索引。 例如,如果您每天向具有 64 GB 内存的数据库写入约 2 GB 的数据,请将 chunk_time_interval
设置为 1 周。 如果您在同一台机器上每天写入约 10 GB 的数据,请将时间间隔设置为 1 天。
注意
如果您使用昂贵的索引类型,例如某些 PostGIS 地理空间索引,请注意检查数据块及其索引的总大小。 您可以使用 chunks_detailed_size
函数来执行此操作。
有关如何优化数据块大小的详细分析,请参阅关于数据块时间间隔的博客文章。 要了解如何查看和设置数据块时间间隔,请参阅关于更改超表数据块间隔的部分。
默认情况下,在您创建超表时会自动创建索引。 您可以通过将 create_default_indexes
选项设置为 false
来阻止索引创建。
默认索引为
- 在所有超表上,按时间降序排列的索引
- 在具有空间分区的超表上,按空间参数和时间排列的索引
超表对唯一约束和索引有一些限制。 如果您想要超表上的唯一索引,则它必须包含表的所有分区列。 要了解更多信息,请参阅关于在超表上创建唯一索引的部分。
您可以使用 PostgreSQL ANALYZE
命令来查询超表中的所有数据块。 ANALYZE
命令收集的统计信息供 PostgreSQL 计划器用于创建最佳查询计划。 有关 ANALYZE
命令的更多信息,请参阅 PostgreSQL 文档。
关键词
在此页面上发现问题?报告问题 或 在 GitHub 上编辑此页。