跳转到主要内容

数据类型

数值类型

在 ClickHouse 和 Snowflake 之间迁移数据的用户会立刻注意到, 在数值类型声明方面,ClickHouse 提供了更细致的精度控制。例如, Snowflake 使用 Number 类型表示数值。这要求用户指定 precision (总位数) 和 scale (小数点右侧的位数) , 总位数最高可达 38。整数声明与 Number 等价,只是定义了固定的 precision 和 scale,并且取值范围相同。之所以能做到这一点, 是因为在 Snowflake 中,修改 precision (整数的 scale 为 0) 并不会影响 磁盘上的数据大小——在写入时,系统会在微分区级别根据数值范围使用 所需的最少字节数。不过,scale 确实会影响存储空间, 而这部分影响可以通过压缩来抵消。Float64 类型则提供了 更大的取值范围,但会损失一定精度。 相比之下,ClickHouse 为浮点数和整数提供了多种有符号和无符号的 精度选项。借助这些类型,你可以明确指定整数所需的精度, 以优化存储和内存开销。与 Snowflake 的 Number 类型等价的 Decimal 类型,还提供了两倍的 precision 和 scale,上限可达 76 位。 除了类似的 Float64 类型外, ClickHouse 还提供了 Float32,适用于对精度要求不那么高而 更看重压缩效果的场景。

字符串

ClickHouse 和 Snowflake 在字符串数据的存储方式上采取了截然不同的方案。Snowflake 中的 VARCHAR 以 UTF-8 编码存储 Unicode 字符,并允许用户指定最大长度。这个长度对存储或性能没有影响,系统始终会使用最少的字节数来存储字符串;它更多只是用于提供对下游工具有帮助的约束。其他类型 (如 TextNChar) 都只是该类型的别名。相比之下,ClickHouse 使用 String 类型将所有字符串数据按原始字节存储 (无需指定长度) ,并将编码处理交由用户决定,同时提供适用于不同编码的查询时函数。关于这样设计背后的原因,我们建议读者参阅 “Opaque data argument”。因此,从实现方式来看,ClickHouse 的 String 更接近 Snowflake 的 Binary 类型。SnowflakeClickHouse 都支持“排序规则”,允许用户覆盖字符串的排序和比较方式。

半结构化类型

Snowflake 支持用于半结构化 数据的 VARIANTOBJECTARRAY 类型。 ClickHouse 提供了对应的 VariantObject (现已弃用,推荐改用原生 JSON 类型) 和 Array 类型。此外,ClickHouse 还提供了 JSON 类型,用于替代现已弃用的 Object('json') 类型,并且与其他原生 JSON 类型相比在 性能和存储效率方面尤为出色。 ClickHouse 还通过 Nested 类型 支持具名 Tuples 和 Tuple 数组, 使用户能够显式映射嵌套结构。这样便可以在整个层级中应用编解码器和类型 优化;而 Snowflake 则不同,它要求用户对外层 对象使用 OBJECTVARIANTARRAY 类型,并且不允许显式定义内部类型。 这种内部类型定义也简化了 ClickHouse 中对嵌套数值的查询, 因为它们无需进行类型转换,并且可用于索引定义。 在 ClickHouse 中,编解码器和优化类型也可以应用到子结构。 这还带来了额外的好处:嵌套结构的压缩效果 依然非常出色,并且可与扁平化数据相媲美。相比之下,由于 无法将特定类型应用到子结构,Snowflake 建议将数据扁平化, 以获得最佳压缩效果。 Snowflake 还对这些数据类型施加了大小限制

类型参考

最后,ClickHouse 还提供了一项独特能力,可以存储 聚合函数状态这样的中间结果。这种 状态取决于具体实现,但它允许将聚合结果存储起来, 并在之后进行查询 (配合相应的 merge 函数) 。通常,这项 功能通过 materialized view 使用,并且如下所示,它能够以极低的存储成本 通过存储针对已插入数据的查询增量结果,提升特定查询的性能 (更多细节见此处) 。
最后修改于 2026年7月2日