- Part 类型 (Wide 与 Compact) :列数据在 part 内的存储方式
- 存储格式 (Full 与 Packed) :part 的文件在磁盘上的存储方式
数据分区片段类型:Wide 与 Compact
各类型的使用时机
min_bytes_for_wide_part:数据分区片段使用Wide格式所需的最小字节数min_rows_for_wide_part:数据分区片段使用Wide格式所需的最小行数
Compact 格式存储;否则将使用 Wide 格式。
性能注意事项
- 摄取性能更好
- 适合需要查询所有列的场景
- 对小 parts 更高效
- 对于只选择部分列的查询更高效
- 更适合按需访问列的大型数据集
min_bytes_for_wide_part 设置为 0。
这在以下场景中会很有用:
- 当你的表有很多列 (例如超过 600 列) 并且要进行大批量 insert 时,将其设为 0 有助于提升性能
- 用于优化
system.metric_log和system.text_log等系统表在 merge 期间占用过多内存时的内存使用情况 - 当处理高 insert 量的表,并且希望优化存储和 merge behavior 时
- 当你希望 part 格式行为保持一致,并且不想承担基于大小阈值进行格式切换所带来的 overhead 时
限制
system.parts_columns 时,compact parts 的 column_data_compressed_bytes 和 column_data_uncompressed_bytes 将显示为 0。更多信息,请参见“查找 wide 或 compact parts 的数量和大小”。
存储格式:Full vs Packed
Full 存储
Packed 存储
- 更少的 S3/对象存储 API 调用
- 减轻协调服务的元数据压力
- 更低的存储成本 (Full 存储的成本可能会高得多)
- 在远程存储上,小分片的性能更好
何时使用 Packed 存储
- 未压缩字节数 <
min_bytes_for_full_part_storage - 行数 <
min_rows_for_full_part_storage - 合并级别 <
min_level_for_full_part_storage
0,因此除非你调高其中某一个值,否则分片会使用 Full 存储。
降级兼容性一旦某个分片以 Packed 存储方式写入,不支持 Packed 存储的 ClickHouse 版本将无法再读取它。因此,启用 Packed 存储后,将无法降级到这类版本,所以只有在你确认不需要回滚时才应启用它。
min_level_for_full_part_storage 设置可用于同时优化对象存储上的性能和成本,尤其适合持续接收插入的表。
该设置从 ClickHouse 25.10 版本开始可用,并与 min_level_for_wide_part 配合使用,从而对分片存储策略进行全面控制。
在以下用例中,可以考虑将其从默认值 (0) 调整为其他值:
- 当表持续进行数据摄取时,初始分片很快就会被合并,因此一开始就将其存储为完整分片格式会造成浪费
- 设置此参数可以避免插入期间高成本的 S3 PUT 请求。例如,一项分析表明,生成完整分片的插入平均每次会产生 31.3 个 PUT 请求,而仅生成 packed 分片的插入平均每次仅产生 2.22 个 PUT 请求
- 插入操作会更快,尤其是对于包含大量列的表,因为 packed 存储会将所有数据写入一个文件,而不是为每一列分别创建文件。
min_level_for_full_part_storage = 2。
这样可确保:
- 0 级分片 (初始插入) 使用 packed 存储
- 1 级分片 继续使用 packed 存储
- 只有 2 级及以上的分片 才使用完整存储格式
分片类型与存储格式的组合
查询 part 相关信息
system.parts 表查看现有 parts 的 part 类型和存储类型: