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

语法

关键字 SAMPLES 有一个别名 DATA,保留它是为了保持向后兼容性。

用法

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

外部列

TimeSeries 表的列会自动生成。这些列属于外部列,不存储任何数据,只为 SELECT/INSERT 提供接口。实际数据存储在目标表中。以下是外部列列表: 示例:
在插入时,metric_name 可以为空,这表示指标名称是在 tags__name__ 中指定的,例如:
要插入指标元数据,请写入 metric_familytypeunithelp 列:

指定外部列

可以在 CREATE TABLE 语句中显式列出外部 time_series 列,以覆盖其默认的 Array(Tuple(DateTime64(3), Float64)) 类型。ClickHouse 会从该元组中提取时间戳类型和值类型,并将它们传递到内部样本表:
这相当于直接在 samples 的 INNER COLUMNS 子句中声明时间戳列和值列的类型:
如果在同一条 CREATE TABLE 语句中同时使用这两种形式,则声明的类型必须一致。

目标表

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

Samples 表

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

标签表

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

指标表

metrics 表包含有关已采集指标、其类型及描述的信息。 metrics 表必须包含以下列:

创建

可以通过多种方式使用 TimeSeries 表引擎创建表。 最简单的语句
实际上会创建下列表 (可通过执行 SHOW CREATE TABLE my_table 查看) :
因此,这些列是自动生成的,而且还有三个内部目标表,它们各自的列定义 存储在 INNER COLUMNS 子句中。 内部目标表的名称类似于 .inner_id.samples.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.inner_id.tags.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.inner_id.metrics.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, 并且每个目标表都有各自的一组列:

使用现有表创建表

语句 CREATE TABLE new_table AS existing_table 会从 existing_table 复制以下内容:
  • SETTINGS
  • 每种类型的 INNER COLUMNS
  • 每种类型的 INNER ENGINE
如果 existing_table 包含外部目标,则不允许使用该语句。 外部列列表会重新生成,而不会被复制。

调整列类型

你可以使用 INNER COLUMNS 子句来调整内部目标表中各列的类型。例如,要将时间戳以微秒存储,并将值存储为 Float32
同一子句也可用于指定编解码器及其他列属性:

id

id 列包含标识符;每个标识符都是根据某个指标名称与标签的组合计算得出的。 用于生成标识符的类型和 DEFAULT 表达式可通过 TAGS INNER COLUMNS 子句自定义:
The id 列的类型必须是 UUIDUInt64UInt128FixedString(16) 之一。如果未提供 DEFAULT 表达式,ClickHouse 会根据 id 类型自动选择。samples 和 tags 内部表中声明的 id 类型必须保持一致。 id_generator 设置也支持相同的自定义,而无需使用 INNER COLUMNS 子句:
如果设置了此项,即使该列的 DEFAULT 包含其他表达式,也会用它来生成 id

tagsall_tags

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

内部目标表的表引擎

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

外部目标表

可以让 TimeSeries 表使用手动创建的目标表:
外部表的列类型 (idtimestampvalue,以及 tags_to_columns 中列出的各个 <tag_value_column>) 必须与 TimeSeries 表原本会在内部生成的类型一致 (类型约束请参见 Samples 表标签表指标表) 。类型不匹配会在 CREATE 时报告。 外部标签目标的 id 生成器表达式会在 INSERT 时按以下顺序解析:先是 id_generator 设置 (如果已设置) ,然后是外部表 id 列上声明的 DEFAULT (如果有) ,最后是根据 id 类型派生出的规范生成器) 。因此,该设置会覆盖外部表上声明的任何 DEFAULT——详见 The id column

修改设置

执行 CREATE 后,可更改以下两个设置:
  • id_generator
  • filter_by_min_time_and_max_time
请注意,如果在标签表中已有数据后更改 id_generator,同一 metric+tag 组合可能会生成不同的 ID——旧行会保留原来的 ID,新行则会使用新的生成器。 其他设置不能通过 ALTER ... MODIFY SETTING 更改,因为它们在 CREATE 时就已经固化在内部表的 schema 中。

设置

以下列出了在定义 TimeSeries 表时可指定的设置:

函数

以下列出了支持将 TimeSeries 表作为参数的函数:
最后修改于 2026年7月2日