OPTIMIZE FINAL 是一条 DDL 命令,用于在物理层面对磁盘上的数据进行永久性重组
和优化。它会物理合并 MergeTree 表中的数据分区片段,
并在此过程中通过从存储中删除重复行来完成数据去重。
FINAL 是一个查询时修饰符,可在
不改变已存储数据结构的情况下返回去重后的结果。它通过在读取时执行合并逻辑来实现。
这是临时性的,只会影响当前查询结果。
通常会建议用户避免使用 OPTIMIZE FINAL,因为它会带来显著的
性能开销,不过也不应将两者混为一谈。为了获得无重复的数据结果,通常有必要
使用 FINAL,特别是在使用 ReplacingMergeTree 之类的表
引擎时,因为这些表中可能包含尚未在后台逐步合并过程中
被替换掉的重复行。
下表总结了两者的主要区别:
何时使用两者
OPTIMIZE FINAL:
- 你希望长期提升查询性能
- 你能够承担一次性优化成本
- 你正在进行定期的表维护
- 你希望从物理层面清理重复数据
FINAL:
- 你需要立即获得去重后的结果
- 你无法等待永久优化完成,或并不想进行永久优化
- 你只是偶尔需要去重后的数据
- 你处理的是经常变化的数据