Skip to main content
ClickHouse 使用两个彼此独立的概念来组织 part 内的数据:
  • Part 类型 (Wide 与 Compact) :列数据在 part 内的存储方式
  • 存储格式 (Full 与 Packed) :part 的文件在磁盘上的存储方式

数据分区片段类型:Wide 与 Compact

数据分区片段类型决定了列数据在数据分区片段中的组织方式。

各类型的使用时机

数据分区片段类型由以下表设置控制: 如果某个数据分区片段的字节数或行数中任一项小于对应的设置值,则该分区片段会以 Compact 格式存储;否则将使用 Wide 格式。

性能注意事项

Compact parts:
  • 摄取性能更好
  • 适合需要查询所有列的场景
  • 对小 parts 更高效
Wide parts:
  • 对于只选择部分列的查询更高效
  • 更适合按需访问列的大型数据集
Compact 到 Wide 的 merge 比 Wide 到 Wide 的 merge 更慢,因为 ClickHouse 在 Compact 到 Wide 的转换中使用的是垂直合并算法,而在 Compact 到 Compact 的 merge 中使用的是水平算法。如果你希望无论大小都强制使用 Wide parts,可以将 min_bytes_for_wide_part 设置为 0 这在以下场景中会很有用:
  1. 当你的表有很多列 (例如超过 600 列) 并且要进行大批量 insert 时,将其设为 0 有助于提升性能
  2. 用于优化 system.metric_logsystem.text_log 等系统表在 merge 期间占用过多内存时的内存使用情况
  3. 当处理高 insert 量的表,并且希望优化存储和 merge behavior 时
  4. 当你希望 part 格式行为保持一致,并且不想承担基于大小阈值进行格式切换所带来的 overhead 时
值得注意的是,虽然将其设为 0 可以改善某些性能表现,但由于 Wide parts 格式,可能会对 S3 storage 产生更多 GET requests。

限制

不会为 compact parts 计算列大小统计信息,这可能会影响监控和优化。查询 system.parts_columns 时,compact parts 的 column_data_compressed_bytescolumn_data_uncompressed_bytes 将显示为 0。更多信息,请参见“查找 wide 或 compact parts 的数量和大小”

存储格式:Full vs Packed

存储格式决定了分片文件在磁盘上的物理存放方式。

Full 存储

在完整存储中,每个数据分片都由多个彼此独立的文件组成,并分别存储在磁盘上。这是默认的存储格式。

Packed 存储

在 Packed 存储中,所有分片文件都会打包为单个归档文件。这会显著减少文件操作次数;而对于 S3 这类远程存储来说,这一点尤为重要,因为每个请求都会带来相应的延迟和成本。 Packed 存储的优势:
  • 更少的 S3/对象存储 API 调用
  • 减轻协调服务的元数据压力
  • 更低的存储成本 (Full 存储的成本可能会高得多)
  • 在远程存储上,小分片的性能更好

何时使用 Packed 存储

如果满足以下任一条件,分片就会使用 Packed 存储: Packed 存储需要显式启用:这三个设置的默认值均为 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 类型和存储类型:
你会看到类似下面这样的内容:
最后修改于 2026年7月23日