OPTIMIZE FINAL の実行は避けるべきです。これは、
クラスターのパフォーマンスに影響を及ぼしかねない、リソース負荷の高い処理を開始するためです。
OPTIMIZE FINAL と FINAL
OPTIMIZE FINAL は FINAL と同じではありません。ReplacingMergeTree のように、
重複のない結果を得るために FINAL の使用が必要になる場合があります。一般に、
クエリが主キーに含まれるものと同じカラムでフィルタしているのであれば、FINAL を使用しても問題ありません。避けるべき理由
コストが高くつきます
OPTIMIZE FINAL を実行すると、たとえ大規模なマージがすでに行われていても、ClickHouse はアクティブなすべてのパーツを1つのパーツへ強制的にマージします。これには次の処理が伴います。
- すべてのパーツの圧縮解除
- データのマージ
- 再圧縮
- 最終的なパーツのディスクまたはオブジェクトストレージへの書き込み
安全上の制限を無視する
OPTIMIZE FINAL はこの安全策を無視するため、次のようなことが起こりえます。
- 150 GB のパーツを複数、1 つの巨大なパーツにマージしようとする可能性があります
- その結果、マージに長時間かかる、メモリ負荷が高まる、さらにはメモリ不足エラーが発生することがあります
- こうした大きなパーツはさらにマージしにくくなり、つまり上記の理由から、その後のマージも失敗する可能性があります。クエリ時に正しい動作をさせるためにマージが必要な場合、これは ReplacingMergeTree で重複が蓄積する などの望ましくない結果を招き、クエリ時のパフォーマンス低下につながる可能性があります。