> ## 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` テーブル内の data parts を物理的にマージし、
その過程でストレージ上の重複した行を削除して、データの重複排除を行います。

`FINAL` は、保存されているデータの構造を変更せずに、**クエリ時** に
重複排除済みの結果を返す修飾子です。読み取り時にマージ処理を
適用することで機能します。これは一時的なもので、現在のクエリ結果にのみ影響します。

`OPTIMIZE FINAL` はパフォーマンスへの負荷が大きいため、
使用を避けるよう勧められることがよくありますが、この 2 つを混同すべきではありません。重複のない結果を得るには、
`FINAL` の使用が必要になることがよくあります。特に `ReplacingMergeTree` のようなテーブル
エンジンを使っている場合は重要です。こうしたテーブルには、最終的に実行されるバックグラウンドの
マージ処理でまだ置き換えられていない重複行が含まれていることがあります。

以下の表は、主な違いをまとめたものです。

| 観点      | `OPTIMIZE FINAL`       | `FINAL`                     |
| ------- | ---------------------- | --------------------------- |
| 種類      | DDL コマンド               | クエリ修飾子                      |
| 効果      | 永続的なストレージ最適化           | クエリ時の一時的な重複排除               |
| パフォーマンス | 一度だけ高コストだが、その後のクエリは高速化 | 1 回あたりのコストは低いが、クエリごとに繰り返される |
| データ変更   | はい - ストレージを物理的に変更する    | いいえ - 読み取り専用の操作             |
| ユースケース  | 定期的な保守/最適化             | リアルタイムの重複排除クエリ              |

<div id="when-to-use-each">
  ## それぞれの使い分け
</div>

次のような場合は `OPTIMIZE FINAL` を使用します。

* クエリパフォーマンスを恒久的に改善したい
* 一回限りの最適化コストを許容できる
* 定期的にテーブルのメンテナンスを行っている
* 重複データを物理的にクリーンアップしたい

次のような場合は `FINAL` を使用します。

* 重複排除された結果をすぐに得る必要がある
* 恒久的な最適化を待てない、またはそれを望まない
* 重複排除されたデータが必要になるのはたまにだけである
* 頻繁に変化するデータを扱っている

どちらも有用なツールですが、ClickHouse の重複排除戦略において、それぞれ用途が異なります。
