这是一个 Experimental 功能,未来的发行版中可能会发生不向后兼容的变更。
使用 allow_experimental_time_series_table 设置
启用 TimeSeries 表引擎。
输入命令
set allow_experimental_time_series_table = 1。语法
关键字
SAMPLES 有一个别名 DATA,保留它是为了保持向后兼容性。用法
TimeSeries 表) :
外部列
示例:
metric_name 可以为空,这表示指标名称是在 tags 的 __name__ 中指定的,例如:
metric_family、type、unit 和 help 列:
指定外部列
CREATE TABLE 语句中显式列出外部 time_series 列,以覆盖其默认的 Array(Tuple(DateTime64(3), Float64)) 类型。ClickHouse 会从该元组中提取时间戳类型和 scalar 类型,并将它们传递到内部samples表:
INNER COLUMNS 子句中声明时间戳列和值列的类型:
CREATE TABLE 语句中同时使用这两种形式,则声明的类型必须一致。
目标表
TimeSeries 表本身不存储数据,所有数据都保存在其目标表中。
这与 materialized view 的工作方式类似,
区别在于 materialized view 只有一个目标表,
而 TimeSeries 表有三个目标表,分别名为 samples、标签 和 metrics。
这些目标表既可以在 CREATE TABLE 查询中显式指定,
也可以由 TimeSeries 表引擎自动生成内部目标表。
插入 TimeSeries 表的行会被转换、拆分为块,并写入这三个目标表。
目标表如下:
Samples 表
引擎自行创建的列会使用时间序列压缩编解码器:
timestamp CODEC(DoubleDelta, ZSTD(1)) 和 value CODEC(ZSTD(3))。近乎单调的时间戳使用通用编解码器时几乎无法
压缩,因而可能会占据 samples 表磁盘存储空间的大部分。
另请参阅调整列的类型。
tags 表包含针对每种指标名称与标签组合计算出的标识符。
tags 表必须包含以下列:
指标表
创建
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 子句自定义:
id 列可以是任何可比较的非 Nullable 类型。samples 和 标签 内部表中声明的 id 类型必须保持一致。
如果未为 id 列提供 DEFAULT 表达式且未设置 id_generator 设置,ClickHouse 会根据 id 类型自动选择 DEFAULT 表达式,但仅当 id 类型为 UUID、UInt64、UInt128、FixedString(16),或由其中两种类型组成的元组时才会这样做。对于此类元组,自动选择的表达式会在第一个组件中计算指标名称的哈希值,并在第二个组件中计算所有标签的哈希值。
id_generator 设置也支持相同的自定义,而无需使用 INNER COLUMNS 子句:
DEFAULT 包含其他表达式,也会用它来生成 id。
tags 列包含时间序列的所有标签,其中包括带有指标名称的 __name__ 标签。
tags_to_columns 设置允许指定将某个特定标签也存储在单独的列中,
作为 tags 列中 Map 的补充:
instance 和 job 列添加到内部标签目标表中。
标签 instance 和 job 的值将同时存储在这些列和 tags 列中。
在由旧版 ClickHouse 创建的表中,
tags 列仅包含未存储在专用
列中且不含指标名称的标签,而 all_tags 列是一个临时列,会在插入时填充
除指标名称外的所有标签。内部目标表的表引擎
- samples 表使用 MergeTree;
- 标签 表使用 AggregatingMergeTree,因为相同的数据通常会多次插入该表,因此需要一种去重方式,
同时还需要对列
min_time和max_time进行聚合; - metrics 表使用 ReplacingMergeTree,因为相同的数据通常会多次插入该表,因此需要一种去重方式。
tags Map) 放在其排序键之外,
而 AggregatingMergeTree 默认会拒绝这种做法 (请参见 allow_dimensions_outside_sorting_key) 。
这在这里是安全的,因为这些列在函数上依赖于 id,而 id 是排序键的一部分,因此后台合并折叠到一起的所有
行都具有相同的值。当内部 标签 表被生成,或者其引擎像上面那样以内联方式指定时,
TimeSeries 会自动为其设置 allow_dimensions_outside_sorting_key = 1;
对于手动创建的外部聚合 标签 表,则必须自行设置。
外部目标表
TimeSeries 表使用手动创建的目标表:
id、timestamp、value,以及 tags_to_columns 中列出的各个 <tag_value_column>) 必须与 TimeSeries 表原本会在内部生成的类型一致 (类型约束请参见 Samples 表、标签表 和 指标表) 。类型不匹配会在 CREATE 时报告。
外部标签目标的 id 生成器表达式会在 INSERT 时按以下顺序解析:先是 id_generator 设置 (如果已设置) ,然后是外部表 id 列上声明的 DEFAULT (如果有) ,最后是根据 id 类型派生出的规范生成器) 。因此,该设置会覆盖外部表上声明的任何 DEFAULT——详见 The id column。
修改设置
CREATE 后,可更改以下两个设置:
id_generatorfilter_by_min_time_and_max_time
id_generator,同一指标+tag 组合可能会生成不同的 ID——旧行会保留原来的 ID,新行则会使用新的生成器。
其他设置不能通过 ALTER ... MODIFY SETTING 更改,因为它们在 CREATE 时就已经固化在内部表的 schema 中。
设置
TimeSeries 表时可指定的设置:
函数
TimeSeries 表作为参数的函数: