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

それぞれの使い分け

次のような場合は OPTIMIZE FINAL を使用します。
  • クエリパフォーマンスを恒久的に改善したい
  • 一回限りの最適化コストを許容できる
  • 定期的にテーブルのメンテナンスを行っている
  • 重複データを物理的にクリーンアップしたい
次のような場合は FINAL を使用します。
  • 重複排除された結果をすぐに得る必要がある
  • 恒久的な最適化を待てない、またはそれを望まない
  • 重複排除されたデータが必要になるのはたまにだけである
  • 頻繁に変化するデータを扱っている
どちらも有用なツールですが、ClickHouse の重複排除戦略において、それぞれ用途が異なります。
最終更新日 2026年6月10日