この例外が意味すること
MergeTree テーブル内のアクティブなデータパーツ数に対する設定済みの上限を INSERT が超える場合、Too many parts 例外をスローします。この例外には、多くの場合、Merges are processing significantly slower than inserts というメッセージも含まれます。
同期 INSERT は、それぞれ少なくとも 1 つのデータパーツを作成します。insert に複数のパーティション値の行が含まれている場合、ClickHouse は影響を受ける各パーティションに対して 1 つずつパーツを作成できます。バックグラウンドマージによって小さなパーツはより大きなパーツへと結合されますが、ClickHouse がマージする速度を上回るペースで新しいパーツが作成されると、アクティブなパーツ数は増え続けます。
この例外は、次のいずれかの設定によってトリガーされる可能性があります。
parts_to_throw_insert: 単一のパーティション内のアクティブなパーツ数を制限します。max_parts_in_total: テーブル内のアクティブなパーツ総数を制限します。
原因を特定する
max_parts_in_total によって適用されるテーブル全体の上限を確認するには、テーブル内のすべてのアクティブなパーツを数えます。
- 頻繁に行われる小規模な同期 insert。
- カーディナリティの高いパーティション化キー。
- 多数のパーティション値にまたがる行を含む insert。
- ストレージのスループット制限、空きディスク容量の不足、またはその他のリソース競合により、バックグラウンドマージが追いつかない。
system.merges で確認でき、マージの失敗についてはサーバーログを確認できます。
例外の解決
同期 INSERT のバッチ化
INSERT を目安にしてください。INSERT の回数を減らして 1 回あたりのサイズを大きくすると、作成されるパーツが減り、バックグラウンドマージに必要な処理も少なくなります。
非同期挿入を使用する
wait_for_async_insert = 1 のままにしてください。
パーティショニングキーを見直す
マージのボトルネックを調査する
第一の対処としてパーツ数の制限引き上げは避けてください
parts_to_throw_insert や max_parts_in_total を増やしても、パーツが過剰に作成される原因そのものは解決できません。制限値を引き上げれば例外の発生を遅らせることはできますが、その一方でファイルシステムやメタデータのオーバーヘッドが増え、クエリパフォーマンスが低下する可能性があります。これらの設定を変更するのは、原因を特定し、システムに十分な余力があることを確認した後にしてください。
復旧を確認する
system.merges の監視を続けてください。