跳转到主要内容
一种用于存储时间序列的表引擎,即一组与时间戳和标签 (或标记) 关联的值:
这是一个 Experimental 功能,未来的发行版中可能会发生不向后兼容的变更。 使用 allow_experimental_time_series_table 设置 启用 TimeSeries 表引擎。 输入命令 set allow_experimental_time_series_table = 1

语法

用法

一开始先使用默认设置会更简单 (可以在不指定列列表的情况下创建 TimeSeries 表) :
随后,该表可与以下协议配合使用 (必须在服务器配置中分配端口) :

目标表

TimeSeries 表本身不存储数据,所有数据都保存在其目标表中。 这与 materialized view 的工作方式类似, 区别在于 materialized view 只有一个目标表, 而 TimeSeries 表有三个目标表,分别名为 data标签metrics 这些目标表既可以在 CREATE TABLE 查询中显式指定, 也可以由 TimeSeries 表引擎自动生成内部目标表。 目标表如下:

Data 表

data 表包含与某个标识符关联的时间序列。 data 表必须包含以下列:

标签表

tags 表包含针对每种指标名称与标签组合计算出的标识符。 tags 表必须包含以下列:

指标表

metrics 表包含有关已采集指标、其类型及描述的信息。 metrics 表必须包含以下列: 插入到 TimeSeries 表中的任何行,实际上都会存储在这三个目标表中。 TimeSeries 表包含 datatagsmetrics 表中的所有这些列。

创建

可以通过多种方式使用 TimeSeries 表引擎创建表。 最简单的语句
实际上会创建下列表 (可通过执行 SHOW CREATE TABLE my_table 查看) :
因此,这些列是自动生成的,而且在这条语句中还有三个内部 UUID—— 每个已创建的内部目标表各对应一个。 (内部 UUID 默认不会显示,除非将设置 show_table_uuid_in_table_create_query_if_not_nil 启用。) 内部目标表的名称类似于 .inner_id.data.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.inner_id.tags.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.inner_id.metrics.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, 并且每个目标表都包含一些列,它们是主 TimeSeries 表中列的一个子集:

调整列类型

你几乎可以在定义主表时,通过显式指定内部目标表中几乎任意列的类型来调整其类型。例如,
这会使内部的 data 表以微秒而非毫秒存储时间戳:

id

id 列包含标识符,每个标识符都是根据某个指标名称与标签组合计算得出的。 id 列的 DEFAULT 表达式用于计算这类标识符。 id 列的类型和该表达式都可以通过显式指定进行调整:

tagsall_tags

有两列包含标签的 Map:tagsall_tags。在这个示例中,它们的含义相同;但如果使用 tags_to_columns 设置, 它们也可能不同。此设置允许指定将某个特定标签存储在单独的列中,而不是存储 在 tags 列中的 Map 内:
该语句将添加以下列:
加入到 my_table 及其内部标签目标表的定义中。在这种情况下,tags 列将不包含 instancejob 这两个标签, 但 all_tags 列会包含它们。all_tags 列是临时列,其唯一用途是用于 id 列的 DEFAULT 表达式 中。 可以通过显式指定列类型来进行调整:

内部目标表的表引擎

默认情况下,内部目标表使用以下表引擎:
  • data 表使用 MergeTree
  • tags 表使用 AggregatingMergeTree,因为相同的数据通常会多次插入该表,因此需要一种去重方式, 同时还需要对列 min_timemax_time 进行聚合;
  • metrics 表使用 ReplacingMergeTree,因为相同的数据通常会多次插入该表,因此需要一种去重方式。
如果指定了其他表引擎,内部目标表也可以使用它们:

外部目标表

也可以让 TimeSeries 表使用手动创建的表:

设置

以下列出了在定义 TimeSeries 表时可指定的设置: 以下列出了支持将 TimeSeries 表作为参数的函数:
最后修改于 2026年6月12日