OPTIMIZE FINAL は、ディスク上のデータを物理的かつ永続的に再編成し、
最適化する DDL コマンドです。MergeTree テーブル内の data parts を物理的にマージし、
その過程でストレージ上の重複した行を削除して、データの重複排除を行います。
FINAL は、保存されているデータの構造を変更せずに、クエリ時 に
重複排除済みの結果を返す修飾子です。読み取り時にマージ処理を
適用することで機能します。これは一時的なもので、現在のクエリ結果にのみ影響します。
OPTIMIZE FINAL はパフォーマンスへの負荷が大きいため、
使用を避けるよう勧められることがよくありますが、この 2 つを混同すべきではありません。重複のない結果を得るには、
FINAL の使用が必要になることがよくあります。特に ReplacingMergeTree のようなテーブル
エンジンを使っている場合は重要です。こうしたテーブルには、最終的に実行されるバックグラウンドの
マージ処理でまだ置き換えられていない重複行が含まれていることがあります。
以下の表は、主な違いをまとめたものです。
| 観点 | OPTIMIZE FINAL | FINAL |
|---|---|---|
| 種類 | DDL コマンド | クエリ修飾子 |
| 効果 | 永続的なストレージ最適化 | クエリ時の一時的な重複排除 |
| パフォーマンス | 一度だけ高コストだが、その後のクエリは高速化 | 1 回あたりのコストは低いが、クエリごとに繰り返される |
| データ変更 | はい - ストレージを物理的に変更する | いいえ - 読み取り専用の操作 |
| ユースケース | 定期的な保守/最適化 | リアルタイムの重複排除クエリ |
それぞれの使い分け
OPTIMIZE FINAL を使用します。
- クエリパフォーマンスを恒久的に改善したい
- 一回限りの最適化コストを許容できる
- 定期的にテーブルのメンテナンスを行っている
- 重複データを物理的にクリーンアップしたい
FINAL を使用します。
- 重複排除された結果をすぐに得る必要がある
- 恒久的な最適化を待てない、またはそれを望まない
- 重複排除されたデータが必要になるのはたまにだけである
- 頻繁に変化するデータを扱っている