真实建一张含Array/Tuple/Map三种复合类型的表,用columns_substreams.txt精确核对每种类型在磁盘上真实拆分成了几个物理文件。
代码CREATE TABLE demo.atmtest ( k UInt64, arr Array(UInt32), tup Tuple(a UInt32, b String), mp Map(String, UInt32) ) ENGINE=MergeTree ORDER BY k; INSERT INTO demo.atmtest SELECT number, [number,number+1,number+2], (number, toString(number)), map('x', number, 'y', number+1) FROM numbers(1000000);
1 substreams for column `k`: k ← 简单类型,1个文件 2 substreams for column `arr` (Array(UInt32)): arr.size0 ← 真实存每行数组的长度/偏移信息 arr ← 真实存所有数组元素拍平后的值 3 substreams for column `tup` (Tuple(a UInt32, b String)): tup.a ← Tuple的第1个字段,真实独立存储 tup.b.size ← Tuple的第2个字段(String),真实需要长度前缀 tup.b ← 第2个字段的真实数据 4 substreams for column `mp` (Map(String, UInt32)): mp.size0 ← 真实Map当成Array(Tuple)处理,先有长度信息 mp.keys.size ← key是String,真实需要长度前缀 mp.keys ← 所有key真实拍平存储 mp.values ← 所有value真实拍平存储 真实总计:1+2+3+4 = 10个物理.bin文件,对应磁盘上真实的10个文件
这份真实的columns_substreams.txt精确对上了磁盘上真实存在的10个.bin文件——不多不少。
每一步都是本文上面用真实columns_substreams.txt核对出来的原始结果。
columns_substreams.txt