避免 Optimize Final
使用 OPTIMIZE TABLE ... FINAL
查询会启动一个非计划的数据部件合并,将特定表的数据部件合并为一个单独的数据部件。在此过程中,ClickHouse 执行以下步骤
- 读取数据部件。
- 部件被解压缩。
- 部件被合并。
- 它们被压缩成一个单独的部件。
- 然后,该部件被写回对象存储。
上述操作是资源密集型的,会消耗大量的 CPU 和磁盘 I/O。重要的是要注意,即使已经发生合并到单个部件的操作,使用此优化也会强制重写部件。
此外,使用 OPTIMIZE TABLE ... FINAL
查询可能会忽略设置 max_bytes_to_merge_at_max_space_in_pool
,该设置控制 ClickHouse 通常在后台自行合并的部件的最大大小。
max_bytes_to_merge_at_max_space_in_pool
设置默认设置为 150 GB。当运行 OPTIMIZE TABLE ... FINAL
时,将执行上述步骤,从而在合并后生成单个部件。这个剩余的单个部件可能超过此设置默认值指定的 150 GB。这是另一个重要的考虑因素,也是您应该避免使用此语句的原因,因为将大量 150 GB 部件合并为一个部件可能需要大量的时间和/或内存。