跳转到主要内容
OPTIMIZE FINAL 是一条 DDL 命令,用于在物理层面对磁盘上的数据进行永久性重组 和优化。它会物理合并 MergeTree 表中的数据分区片段, 并在此过程中通过从存储中删除重复行来完成数据去重。 FINAL 是一个查询时修饰符,可在 不改变已存储数据结构的情况下返回去重后的结果。它通过在读取时执行合并逻辑来实现。 这是临时性的,只会影响当前查询结果。 通常会建议用户避免使用 OPTIMIZE FINAL,因为它会带来显著的 性能开销,不过也不应将两者混为一谈。为了获得无重复的数据结果,通常有必要 使用 FINAL,特别是在使用 ReplacingMergeTree 之类的表 引擎时,因为这些表中可能包含尚未在后台逐步合并过程中 被替换掉的重复行。 下表总结了两者的主要区别:
方面OPTIMIZE FINALFINAL
类型DDL 命令查询修饰符
效果永久性的存储优化临时的查询时去重
性能影响 一次性成本高,但后续查询更快单次成本较低,但每次查询都要重复执行
数据修改是 - 会物理改变存储否 - 只读操作
使用场景定期维护/优化实时去重查询

何时使用两者

在以下情况下使用 OPTIMIZE FINAL
  • 你希望长期提升查询性能
  • 你能够承担一次性优化成本
  • 你正在进行定期的表维护
  • 你希望从物理层面清理重复数据
在以下情况下使用 FINAL
  • 你需要立即获得去重后的结果
  • 你无法等待永久优化完成,或并不想进行永久优化
  • 你只是偶尔需要去重后的数据
  • 你处理的是经常变化的数据
两者都是很有价值的工具,但在 ClickHouse 的去重策略中各有不同用途。
最后修改于 2026年6月10日