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

TimeSeries 引擎

实验性功能。了解更多。
ClickHouse Cloud 中不支持

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

metric_name1[tag1=value1, tag2=value2, ...] = {timestamp1: value1, timestamp2: value2, ...}
metric_name2[...] = ...
信息

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

语法

CREATE TABLE name [(columns)] ENGINE=TimeSeries
[SETTINGS var1=value1, ...]
[DATA db.data_table_name | DATA ENGINE data_table_engine(arguments)]
[TAGS db.tags_table_name | TAGS ENGINE tags_table_engine(arguments)]
[METRICS db.metrics_table_name | METRICS ENGINE metrics_table_engine(arguments)]

用法

最好从所有默认设置开始(允许创建没有指定列列表的 TimeSeries 表)

CREATE TABLE my_table ENGINE=TimeSeries

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

目标表

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

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

目标表如下

数据表

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

data 表必须具有以下列

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

标签表

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

tags 表必须具有以下列

名称强制?默认类型可能类型描述
id[x]UUIDany(必须与 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))标签的 Map,排除包含指标名称的标签 __name__ 以及在 tags_to_columns 设置中枚举的名称的标签
all_tags[ ]Map(String, String)Map(String, String)Map(LowCardinality(String), String)Map(LowCardinality(String), LowCardinality(String))临时列,每行都是所有标签的 Map,仅排除包含指标名称的标签 __name__。该列的唯一目的是在计算 id 时使用
min_time[ ]Nullable(DateTime64(3))DateTime64(X)Nullable(DateTime64(X))具有该 id 的时间序列的最小时间戳。如果 store_min_time_and_max_timetrue,则创建该列
max_time[ ]Nullable(DateTime64(3))DateTime64(X)Nullable(DateTime64(X))具有该 id 的时间序列的最大时间戳。如果 store_min_time_and_max_timetrue,则创建该列

指标表

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 表引擎创建表。最简单的语句

CREATE TABLE my_table ENGINE=TimeSeries

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

CREATE TABLE my_table
(
`id` UUID DEFAULT reinterpretAsUUID(sipHash128(metric_name, all_tags)),
`timestamp` DateTime64(3),
`value` Float64,
`metric_name` LowCardinality(String),
`tags` Map(LowCardinality(String), String),
`all_tags` Map(String, String),
`min_time` Nullable(DateTime64(3)),
`max_time` Nullable(DateTime64(3)),
`metric_family_name` String,
`type` String,
`unit` String,
`help` String
)
ENGINE = TimeSeries
DATA ENGINE = MergeTree ORDER BY (id, timestamp)
DATA INNER UUID '01234567-89ab-cdef-0123-456789abcdef'
TAGS ENGINE = AggregatingMergeTree PRIMARY KEY metric_name ORDER BY (metric_name, id)
TAGS INNER UUID '01234567-89ab-cdef-0123-456789abcdef'
METRICS ENGINE = ReplacingMergeTree ORDER BY metric_family_name
METRICS INNER UUID '01234567-89ab-cdef-0123-456789abcdef'

因此,列是自动生成的,并且此语句中还有三个内部 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 表列的子集

CREATE TABLE default.`.inner_id.data.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`
(
`id` UUID,
`timestamp` DateTime64(3),
`value` Float64
)
ENGINE = MergeTree
ORDER BY (id, timestamp)
CREATE TABLE default.`.inner_id.tags.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`
(
`id` UUID DEFAULT reinterpretAsUUID(sipHash128(metric_name, all_tags)),
`metric_name` LowCardinality(String),
`tags` Map(LowCardinality(String), String),
`all_tags` Map(String, String) EPHEMERAL,
`min_time` SimpleAggregateFunction(min, Nullable(DateTime64(3))),
`max_time` SimpleAggregateFunction(max, Nullable(DateTime64(3)))
)
ENGINE = AggregatingMergeTree
PRIMARY KEY metric_name
ORDER BY (metric_name, id)
CREATE TABLE default.`.inner_id.metrics.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`
(
`metric_family_name` String,
`type` String,
`unit` String,
`help` String
)
ENGINE = ReplacingMergeTree
ORDER BY metric_family_name

调整列类型

您可以通过在定义主表时显式指定内部目标表的几乎任何列的类型来调整它们。例如,

CREATE TABLE my_table
(
timestamp DateTime64(6)
) ENGINE=TimeSeries

将使内部 data 表以微秒而不是毫秒存储时间戳

CREATE TABLE default.`.inner_id.data.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`
(
`id` UUID,
`timestamp` DateTime64(6),
`value` Float64
)
ENGINE = MergeTree
ORDER BY (id, timestamp)

id

id 列包含标识符,每个标识符都是为指标名称和标签的组合计算的。id 列的 DEFAULT 表达式是将用于计算此类标识符的表达式。id 列的类型和该表达式都可以通过显式指定来调整

CREATE TABLE my_table
(
id UInt64 DEFAULT sipHash64(metric_name, all_tags)
) ENGINE=TimeSeries

tagsall_tags

有两列包含标签的 Map - tagsall_tags。在此示例中,它们的含义相同,但是如果使用设置 tags_to_columns,它们可能会有所不同。此设置允许指定特定标签应存储在单独的列中,而不是存储在 tags 列内的 Map 中

CREATE TABLE my_table ENGINE=TimeSeries SETTINGS = {'instance': 'instance', 'job': 'job'}

此语句将添加列

    `instance` String,
`job` String

my_table 及其内部 tags 目标表的定义。在这种情况下,tags 列将不包含标签 instancejob,但 all_tags 列将包含它们。all_tags 列是临时的,其唯一目的是在 id 列的 DEFAULT 表达式中使用。

可以通过显式指定来调整列的类型

CREATE TABLE my_table (instance LowCardinality(String), job LowCardinality(Nullable(String)))
ENGINE=TimeSeries SETTINGS = {'instance': 'instance', 'job': 'job'}

内部目标表的表引擎

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

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

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

CREATE TABLE my_table ENGINE=TimeSeries
DATA ENGINE=ReplicatedMergeTree
TAGS ENGINE=ReplicatedAggregatingMergeTree
METRICS ENGINE=ReplicatedReplacingMergeTree

外部目标表

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

CREATE TABLE data_for_my_table
(
`id` UUID,
`timestamp` DateTime64(3),
`value` Float64
)
ENGINE = MergeTree
ORDER BY (id, timestamp);

CREATE TABLE tags_for_my_table ...

CREATE TABLE metrics_for_my_table ...

CREATE TABLE my_table ENGINE=TimeSeries DATA data_for_my_table TAGS tags_for_my_table METRICS metrics_for_my_table;

设置

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

名称类型默认值描述
tags_to_columnsMapMap 指定哪些标签应放入 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 表作为参数的函数列表