跳转到主要内容

数据类型

数值类型

在 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 还对这些数据类型施加了大小限制

类型参考

SnowflakeClickHouse说明
NUMBERDecimalClickHouse 支持的精度和标度是 Snowflake 的两倍:76 位,而 Snowflake 为 38 位。
FLOAT, FLOAT4, FLOAT8Float32, Float64Snowflake 中所有浮点类型均为 64 位。
VARCHARString
BINARYString
BOOLEANBool
DATEDate, Date32Snowflake 中的 DATE 支持的日期范围比 ClickHouse 更广,例如 Date32 的最小值为 1900-01-01,而 Date 的最小值为 1970-01-01。ClickHouse 中的 Date 提供了更具成本效益的存储方式 (两字节) 。
TIME(N)没有完全对应的类型,但可以用 DateTimeDateTime64(N) 来表示。DateTime64 在精度方面采用相同的概念。
TIMESTAMP - TIMESTAMP_LTZ, TIMESTAMP_NTZ, TIMESTAMP_TZDateTimeDateTime64DateTimeDateTime64 可以选择为该列指定 TZ 参数。若未指定,则使用服务器的时区。此外,客户端还可使用 --use_client_time_zone 参数。
VARIANTJSON, Tuple, Nested在 ClickHouse 中,JSON 类型目前仍属 Experimental。该类型会在写入时推断列的数据类型。也可以改用 TupleNestedArray 来显式构建类型结构。
OBJECTTuple, Map, JSONOBJECTMap 都类似于 ClickHouse 中键为 StringJSON 类型。ClickHouse 要求值保持一致且具备强类型,而 Snowflake 使用 VARIANT。这意味着不同键对应的值可以是不同类型。如果在 ClickHouse 中需要这种能力,可以使用 Tuple 显式定义层级结构,或直接使用 JSON 类型。
ARRAY数组, 嵌套Snowflake 中的 ARRAY 使用 VARIANT 作为元素类型——即一种超类型。相比之下,ClickHouse 中的这些元素是强类型的。
GEOGRAPHYPoint, Ring, Polygon, MultiPolygonSnowflake 强制采用坐标系 (WGS 84) ,而 ClickHouse 则在查询时应用该坐标系。
GEOMETRYPoint, Ring, Polygon, MultiPolygon
ClickHouse 类型描述
IPv4IPv6IP 专用类型,相比 Snowflake 可能具有更高的存储效率。
FixedString支持使用固定长度的字节,这对哈希值很有用。
LowCardinality支持对任意类型进行字典编码。在预期基数 < 100k 时非常有用。
Enum支持在 8 位或 16 位范围内对命名值进行高效编码。
UUID用于高效存储 UUID。
Array(Float32)向量可表示为由 Float32 组成的 Array,并支持距离函数。
最后,ClickHouse 还提供了一项独特能力,可以存储 聚合函数状态这样的中间结果。这种 状态取决于具体实现,但它允许将聚合结果存储起来, 并在之后进行查询 (配合相应的 merge 函数) 。通常,这项 功能通过 materialized view 使用,并且如下所示,它能够以极低的存储成本 通过存储针对已插入数据的查询增量结果,提升特定查询的性能 (更多细节见此处) 。
最后修改于 2026年6月10日