数据类型
数值类型
Float64 类型则提供了
更大的取值范围,但会损失一定精度。
相比之下,ClickHouse 为浮点数和整数提供了多种有符号和无符号的
精度选项。借助这些类型,你可以明确指定整数所需的精度,
以优化存储和内存开销。与 Snowflake 的 Number 类型等价的
Decimal 类型,还提供了两倍的 precision 和 scale,上限可达 76 位。
除了类似的 Float64 类型外,
ClickHouse 还提供了 Float32,适用于对精度要求不那么高而
更看重压缩效果的场景。
字符串
VARCHAR 以 UTF-8 编码存储 Unicode 字符,并允许用户指定最大长度。这个长度对存储或性能没有影响,系统始终会使用最少的字节数来存储字符串;它更多只是用于提供对下游工具有帮助的约束。其他类型 (如 Text 和 NChar) 都只是该类型的别名。相比之下,ClickHouse 使用 String 类型将所有字符串数据按原始字节存储 (无需指定长度) ,并将编码处理交由用户决定,同时提供适用于不同编码的查询时函数。关于这样设计背后的原因,我们建议读者参阅 “Opaque data argument”。因此,从实现方式来看,ClickHouse 的 String 更接近 Snowflake 的 Binary 类型。Snowflake 和 ClickHouse 都支持“排序规则”,允许用户覆盖字符串的排序和比较方式。
半结构化类型
VARIANT、OBJECT 和 ARRAY 类型。
ClickHouse 提供了对应的 Variant、
Object (现已弃用,推荐改用原生 JSON 类型) 和 Array
类型。此外,ClickHouse 还提供了 JSON
类型,用于替代现已弃用的 Object('json') 类型,并且与其他原生 JSON 类型相比在
性能和存储效率方面尤为出色。
ClickHouse 还通过 Nested 类型
支持具名 Tuples 和 Tuple 数组,
使用户能够显式映射嵌套结构。这样便可以在整个层级中应用编解码器和类型
优化;而 Snowflake 则不同,它要求用户对外层
对象使用 OBJECT、VARIANT 和 ARRAY 类型,并且不允许显式定义内部类型。
这种内部类型定义也简化了 ClickHouse 中对嵌套数值的查询,
因为它们无需进行类型转换,并且可用于索引定义。
在 ClickHouse 中,编解码器和优化类型也可以应用到子结构。
这还带来了额外的好处:嵌套结构的压缩效果
依然非常出色,并且可与扁平化数据相媲美。相比之下,由于
无法将特定类型应用到子结构,Snowflake 建议将数据扁平化,
以获得最佳压缩效果。
Snowflake 还对这些数据类型施加了大小限制。
类型参考
最后,ClickHouse 还提供了一项独特能力,可以存储
聚合函数状态这样的中间结果。这种
状态取决于具体实现,但它允许将聚合结果存储起来,
并在之后进行查询 (配合相应的 merge 函数) 。通常,这项
功能通过 materialized view 使用,并且如下所示,它能够以极低的存储成本
通过存储针对已插入数据的查询增量结果,提升特定查询的性能
(更多细节见此处) 。