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