为何ClickHouse表Part目录仅存在单个bin文件?
以下是几种常见的原因:
启用了低基数列的字典复用
当你的表中多个列都使用LowCardinality类型,且它们的字典内容完全一致时,ClickHouse会开启字典复用(依赖allow_remapping_low_cardinality_keys配置,默认开启),将这些列的索引数据合并存储到单个.bin文件中,而非每个列单独生成文件。你可以通过SHOW CREATE TABLE your_table_name查看列类型,或执行SELECT value FROM system.settings WHERE name = 'allow_remapping_low_cardinality_keys'确认配置状态。使用了Compact存储格式
MergeTree引擎默认采用Wide格式(每个列对应独立的.bin文件),但如果建表时显式指定了storage_format = 'Compact',或者存储策略配置了Compact格式,ClickHouse会将所有列的数据打包到一个data.bin文件中,同时用data.mrk2记录各列数据的偏移位置。执行SHOW CREATE TABLE your_table_name即可查看当前存储格式配置。Part处于临时未合并状态
刚写入的数据会以临时Part(目录名带tmp后缀)的形式存在,此时可能还未完成列文件的拆分。等后台合并任务完成后,临时Part会转为正式Part,每个列对应的.bin文件就会生成。你可以查看Part目录的命名,或执行SELECT name, active FROM system.parts WHERE table = 'your_table_name'确认Part的状态。使用了特殊引擎或物化视图
诸如AggregatingMergeTree、MaterializedView关联的底层表等特殊场景下,引擎可能会对数据做合并存储优化,尤其是当数据经过聚合后列数据关联性极强时,可能会出现单个.bin文件的情况。
内容的提问来源于stack exchange,提问作者Alexandr

