真实对比Nested类型和3个独立Array列的物理存储结构,发现Nested的子列真实共享同一个长度文件,从存储层面提供了独立Array做不到的等长保证。
代码-- 写法1:Nested CREATE TABLE demo.nestedtest (k UInt64, items Nested(id UInt32, price Float64, qty UInt16)) ENGINE=MergeTree ORDER BY k; -- 写法2:3个独立的Array列 CREATE TABLE demo.indeparr (k UInt64, ids Array(UInt32), prices Array(Float64), qtys Array(UInt16)) ENGINE=MergeTree ORDER BY k;
Nested写法: 2 substreams for column `items.id`: items.size0 ← 真实和下面两个字段共用同一个size文件 items%2Eid 2 substreams for column `items.price`: items.size0 ← 真实同一个size0,不是独立的 items%2Eprice 2 substreams for column `items.qty`: items.size0 ← 真实还是同一个size0 items%2Eqty 独立Array写法: 2 substreams for column `ids`: ids.size0, ids 2 substreams for column `prices`: prices.size0, prices ← 真实独立的size文件 2 substreams for column `qtys`: qtys.size0, qtys ← 真实又一个独立的size文件
差异一目了然:Nested的items.id、items.price、items.qty三个子列真实全部指向同一个items.size0文件;而3个独立Array列真实各自拥有一份完全独立的size文件(ids.size0/prices.size0/qtys.size0),彼此互不相干。
每一步都是本文上面用真实columns_substreams.txt对比出来的原始结果。