跳到主要内容
跳到主要内容

时间序列引擎

Experimental feature. Learn more.
Not supported in ClickHouse Cloud

一个存储时间序列的表引擎,即与时间戳和标签(或标记)相关联的一组值:

信息

这是一个实验性功能,未来版本可能会以向后不兼容的方式更改。 使用 allow_experimental_time_series_table 设置启用时间序列表引擎的使用。 输入命令 set allow_experimental_time_series_table = 1

语法

用法

从默认设置开始更容易(允许在不指定列列表的情况下创建 TimeSeries 表):

然后,此表可以通过以下协议使用(必须在服务器配置中分配端口):

目标表

TimeSeries 表没有自己的数据,所有内容都存储在其目标表中。 这类似于 物化视图 的工作方式, 不同之处在于物化视图有一个目标表, 而 TimeSeries 表有三个目标表,分别称为 datatagsmetrics

目标表可以在 CREATE TABLE 查询中显式指定, 或者 TimeSeries 表引擎可以自动生成内部目标表。

目标表如下:

数据表

data 表包含与某个标识符相关的时间序列。

data 表必须具有以下列:

名称必需?默认类型可能类型描述
id[x]UUID任意标识指标名称和标签的组合
timestamp[x]DateTime64(3)DateTime64(X)时间点
value[x]Float64Float32Float64timestamp 相关联的值

标签表

tags 表包含为指标名称和标签的每个组合计算的标识符。

tags 表必须具有以下列:

名称必需?默认类型可能类型描述
id[x]UUID任意(必须与 data 表中的 id 类型匹配)id 标识指标名称和标签的组合。DEFAULT 表达式指定了如何计算该标识符
metric_name[x]LowCardinality(String)StringLowCardinality(String)指标名称
<tag_value_column>[ ]StringStringLowCardinality(String)LowCardinality(Nullable(String))特定标签的值,标签名称和对应列的名称在 tags_to_columns 设置中指定
tags[x]Map(LowCardinality(String), String)Map(String, String)Map(LowCardinality(String), String)Map(LowCardinality(String), LowCardinality(String))标签的映射,不包括标签 __name__,该标签包含指标名称,并排除在 tags_to_columns 设置中列出的标签名称
all_tags[ ]Map(String, String)Map(String, String)Map(LowCardinality(String), String)Map(LowCardinality(String), LowCardinality(String))瞬态列,每一行是所有标签的映射,仅排除标签 __name__,该标签包含指标名称。该列的唯一目的是在计算 id 时使用
min_time[ ]Nullable(DateTime64(3))DateTime64(X)Nullable(DateTime64(X))具有该 id 的时间序列的最小时间戳。如果 store_min_time_and_max_time 设置为 true,则创建此列
max_time[ ]Nullable(DateTime64(3))DateTime64(X)Nullable(DateTime64(X))具有该 id 的时间序列的最大时间戳。如果 store_min_time_and_max_time 设置为 true,则创建此列

指标表

metrics 表包含收集的指标的某些信息、这些指标的类型及其描述。

metrics 表必须具有以下列:

名称必需?默认类型可能类型描述
metric_family_name[x]StringStringLowCardinality(String)指标系列名称
type[x]StringStringLowCardinality(String)指标系列的类型,可能是 "counter"、"gauge"、"summary"、"stateset"、"histogram"、"gaugehistogram" 之一
unit[x]StringStringLowCardinality(String)指标中使用的单位
help[x]StringStringLowCardinality(String)指标的描述

插入到 TimeSeries 表中的任何行实际上都会存储在这三个目标表中。 TimeSeries 表包含来自 datatagsmetrics 表的所有这些列。

创建

有多种方法可以使用 TimeSeries 表引擎创建表。 最简单的语句

实际上会创建以下表(您可以通过执行 SHOW CREATE TABLE my_table 来查看):

所以这些列是自动生成的,并且在此语句中还有三个内部 UUID - 每个内部目标表对应一个 UUID。 (内部 UUID 通常不会显示,直到设置 show_table_uuid_in_table_create_query_if_not_nil 被设置为 true。)

内部目标表的名称类似于 .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

有两个包含标签映射的列 - tagsall_tags。在此示例中,它们的含义相同,然而,如果使用 tags_to_columns 设置时它们可以不同。该设置允许指定特定标签应存储在单独的列中,而不是存储在 tags 列中的映射中:

此语句将在 my_table 及其内部 tags 目标表的定义中添加列

内部目标表的表引擎

默认情况下,内部目标表使用以下表引擎:

  • data 表使用 MergeTree
  • tags 表使用 AggregatingMergeTree,因为相同的数据通常多次插入到此表中,因此我们需要一种方式 去除重复,并且因为需要对 min_timemax_time 列进行聚合;
  • metrics 表使用 ReplacingMergeTree,因为相同的数据通常多次插入到此表中,因此我们需要一种方式 去除重复。

如果指定了其他表引擎,也可以用于内部目标表:

外部目标表

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

设置

以下是定义 TimeSeries 表时可以指定的设置列表:

名称类型默认值描述
tags_to_columnsMap指定应放入 tags 表中单独列的标签的映射。语法: {'tag1': 'column1', 'tag2' : column2, ...}
use_all_tags_column_to_generate_idBooltrue在生成用于计算时间序列标识符的表达式时,此标志启用在该计算中使用 all_tags
store_min_time_and_max_timeBooltrue如果设置为 true,则该表将为每个时间序列存储 min_timemax_time
aggregate_min_time_and_max_timeBooltrue在创建内部目标 tags 表时,此标志启用使用 SimpleAggregateFunction(min, Nullable(DateTime64(3))) 而不是仅将 Nullable(DateTime64(3)) 作为 min_time 列的类型,max_time 列也是如此
filter_by_min_time_and_max_timeBooltrue如果设置为 true,则该表将使用 min_timemax_time 列进行过滤时间序列

函数

以下是支持 TimeSeries 表作为参数的函数列表: