一种数据管理技术分区本质上是一种数据管理技术,而不是查询优化工具。虽然它在某些特定工作负载中可以提升性能,但不应将其作为加速查询的首选手段;必须谨慎选择分区键,清楚了解其影响,并且仅应在它符合数据生命周期需求或已充分理解的访问模式时使用。
PARTITION BY 子句定义的,通常用于按时间间隔、类别或其他与业务相关的维度对行进行分组。分区表达式的每个唯一值都会在磁盘上形成各自独立的物理分区,ClickHouse 会为其中每个值将数据存储在单独的 parts 中。分区有助于改进数据管理、简化保留策略,并且对某些查询模式也有帮助。
例如,考虑下面这个英国房价成交数据集表,其分区键为 toStartOfMonth(date)。
toStartOfMonth(date),将上图中示意的 4 行示例插入数据拆分开来。然后,对于识别出的每个分区,这些行都会像往常一样经过若干连续步骤进行处理 (① 排序,② 拆分为列,③ 压缩,④ 写入磁盘) 。
如需更详细地了解分区,我们建议阅读本指南。
启用分区后,ClickHouse 只会在分区内合并数据分区片段,而不会跨分区合并。下图以上述示例表对此进行了说明:
分区的应用
选择低基数分区键
toStartOfMonth(date) 分区时,按月过滤可让引擎完全跳过无关的分区及其 parts。
虽然分区在某些查询模式下可以提升性能,但它首先是一项数据管理功能。在很多情况下,由于数据碎片更多且需要扫描的 parts 更多,跨所有分区查询反而可能比使用未分区表更慢。请谨慎使用分区,并始终确保所选键具有低基数,且符合您的数据生命周期策略 (例如通过生存时间 (TTL) 实现数据保留) 。如果您不确定是否有必要分区,可以先不进行分区,之后再根据观察到的访问模式进行优化。