> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-fix-nav-issues.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# OPTIMIZE FINAL 和 FINAL 有什么区别？

> 讨论了 OPTIMIZE FINAL 和 FINAL 之间的区别，以及何时应使用或避免使用它们。

`OPTIMIZE FINAL` 是一条 DDL 命令，用于在物理层面对磁盘上的数据进行永久性重组
和优化。它会物理合并 `MergeTree` 表中的数据分区片段，
并在此过程中通过从存储中删除重复行来完成数据去重。

`FINAL` 是一个**查询时**修饰符，可在
不改变已存储数据结构的情况下返回去重后的结果。它通过在读取时执行合并逻辑来实现。
这是临时性的，只会影响当前查询结果。

通常会建议用户避免使用 `OPTIMIZE FINAL`，因为它会带来显著的
性能开销，不过也不应将两者混为一谈。为了获得无重复的数据结果，通常有必要
使用 `FINAL`，特别是在使用 `ReplacingMergeTree` 之类的表
引擎时，因为这些表中可能包含尚未在后台逐步合并过程中
被替换掉的重复行。

下表总结了两者的主要区别：

| 方面   | `OPTIMIZE FINAL`  | `FINAL`            |
| ---- | ----------------- | ------------------ |
| 类型   | DDL 命令            | 查询修饰符              |
| 效果   | 永久性的存储优化          | 临时的查询时去重           |
| 性能   | 影响	一次性成本高，但后续查询更快 | 单次成本较低，但每次查询都要重复执行 |
| 数据修改 | 是 - 会物理改变存储       | 否 - 只读操作           |
| 使用场景 | 定期维护/优化           | 实时去重查询             |

<div id="when-to-use-each">
  ## 何时使用两者
</div>

在以下情况下使用 `OPTIMIZE FINAL`：

* 你希望长期提升查询性能
* 你能够承担一次性优化成本
* 你正在进行定期的表维护
* 你希望从物理层面清理重复数据

在以下情况下使用 `FINAL`：

* 你需要立即获得去重后的结果
* 你无法等待永久优化完成，或并不想进行永久优化
* 你只是偶尔需要去重后的数据
* 你处理的是经常变化的数据

两者都是很有价值的工具，但在 ClickHouse 的去重策略中各有不同用途。
