Timescale 云:性能、规模、企业级
自托管产品
MST
时序数据表示系统、流程或行为随时间变化的方式。超表使 TimescaleDB 能够高效处理时序数据。超表是 PostgreSQL 表,它根据时间自动对时序数据进行分区。每个超表都由称为“块”的子表组成。每个块都分配了一个时间范围,并且只包含该范围内的数据。当您运行查询时,TimescaleDB 会识别正确的块并在其上运行查询,而不是遍历整个表。
Hypercore 是 Timescale 混合行-列式存储引擎,用于超表。传统数据库在快速插入(行式存储)和高效分析(列式存储)之间强制进行权衡。Hypercore 消除了这种权衡,允许实时分析而不会牺牲事务处理能力。
Hypercore 动态地以其生命周期内最有效的格式存储数据
- 最近数据的行式存储:最近的块(可能更多)总是存储在行存储中,确保快速插入、更新和低延迟的单记录查询。此外,行式存储还用作列式存储的直写(writethrough)用于插入和更新。
- 分析性能的列式存储:块会自动压缩成列式存储,优化存储效率并加速分析查询。
与传统列式数据库不同,Hypercore 允许在任何阶段插入或修改数据,使其成为高摄取事务性工作负载和实时分析的灵活解决方案——都在一个单一数据库中。
由于 TimescaleDB 是 100% PostgreSQL,您可以将所有标准 PostgreSQL 表、索引、存储过程和其他对象与超表一起使用。这使得创建和使用超表类似于标准 PostgreSQL。

每个超表都被分区成称为“块”的子超表。每个块都分配了一个时间范围,并且只包含该范围内的数据。如果超表也按空间分区,则每个块也分配了空间值的一个子集。
当 TimescaleDB 创建一个块时,创建时间会存储在目录元数据中。此块的创建时间与块中包含的数据的分区范围不同。在某些情况下,某些功能可以使用此块创建时间元数据。
注意
超表不支持继承,这可能导致意外行为。
每个超表块仅保存特定时间范围内的数据。当您插入来自尚无对应块的时间范围内的数据时,TimescaleDB 会自动创建一个块来存储它。
默认情况下,每个块覆盖 7 天。您可以更改此设置以更好地满足您的需求。例如,如果您将 chunk_interval
设置为 1 天,则每个块存储同一天的数据。不同天的数据存储在不同的块中。
下图显示了关系表和超表之间的结构差异

TimescaleDB 根据 chunk_interval
将时间划分为潜在的块范围。如果某个潜在块范围存在数据,则会创建该块。
实际上,这意味着您最早的块的开始时间不一定等于您的超表中的最早时间戳。相反,开始时间和最早时间戳之间可能存在时间间隔。这不会影响您与超表的常规交互,但可能会影响您检查它时看到的块数量。
块大小会影响插入和查询性能。您希望块足够小以适应内存,这样您就可以插入和查询最新数据而无需从磁盘读取。但是,拥有太多小而稀疏填充的块可能会影响查询计划时间并影响压缩效果。
最佳实践是设置 chunk_interval
,以便在处理之前,一个数据块占用主内存的 25%,包括来自每个活动超表的索引。例如,如果您每天向具有 64 GB 内存的数据库写入大约 2 GB 数据,请将 chunk_interval
设置为 1 周。如果您在同一台机器上每天写入大约 10 GB 数据,请将时间间隔设置为 1 天。
有关如何优化块大小的详细分析,请参阅关于块时间间隔的博客文章。要了解如何查看和设置块时间间隔,请参阅如何优化超表块时间间隔。
默认情况下,当您创建超表时,会自动创建索引。
默认索引包括:
- 在所有超表上,一个按时间降序排列的索引
- 在带有空间分区的超表上,一个按空间参数和时间排列的索引
超表对唯一约束和索引有一些限制。如果要在超表上创建唯一索引,它必须包含表的所有分区列。要了解更多信息,请参阅在超表上使用唯一索引强制约束。
您可以通过将 create_default_indexes
选项设置为 false
来阻止索引创建。
本节向您展示如何
关键词