max_insert_block_size
max_insert_block_size_rows
テーブルへの挿入時に形成されるブロックの最大サイズ (行数) です。
この設定は、次の 2 つの場面でのブロック形成を制御します。
-
フォーマットのパース: server が任意のインターフェイス (HTTP、インラインデータ付きの clickhouse-client、gRPC、PostgreSQL ワイヤプロトコル) から行ベースの入力フォーマット (CSV、TSV、JSONEachRow など) をパースする場合、ブロックは次の条件で出力されます。
- min_insert_block_size_rows と min_insert_block_size_bytes の両方に達した場合、または
- max_insert_block_size_rows または max_insert_block_size_bytes のいずれかに達した場合
-
INSERT 操作: INSERT クエリの実行中、およびデータが materialized view を通過する際のこの設定の動作は、
use_strict_insert_block_limitsによって異なります。-
有効な場合: ブロックは次の条件で出力されます。
- 最小しきい値 (AND) : min_insert_block_size_rows と min_insert_block_size_bytes の両方に達した場合
- 最大しきい値 (OR) : max_insert_block_size_rows または max_insert_block_size_bytes のいずれかに達した場合
- 無効な場合: min_insert_block_size_rows または min_insert_block_size_bytes のいずれかに達するとブロックが出力されます。max_insert_block_size の設定は適用されません。
-
有効な場合: ブロックは次の条件で出力されます。
- 正の整数。
max_insert_block_size_bytes
- 正の整数。
- 0 — この設定はブロック形成に関与しません。
max_insert_delayed_streams_for_parallel_write
50.
max_insert_threads
INSERT クエリの実行に使用するスレッドの最大数です。
これは INSERT SELECT と、データが
clickhouse-client または HTTP インターフェイス経由で送信される通常の INSERT の両方に適用されます。パイプラインの書き込み側
(ブロックの集約と宛先テーブルへの書き込み) は、
この数までのスレッドで並列化されます。
設定可能な値:
- 0 — 自動。サーバーで使用可能な CPU コア数 (
max_threadsと同じ自動値) を使用し、max_insert_threads_min_free_memory_per_threadによりメモリ逼迫時には減らされます。 - 1 —
INSERTは単一スレッドで実行されます (並列実行なし) 。INSERT ... SELECTの挿入順序を維持するには、この値を使用します。 - 1 より大きい正の整数 — 指定した数のスレッドで並列実行します。
1 (並列実行なし) でした。26.8 以降、デフォルト値 (0) は CPU コア数に設定されるため、INSERT はデフォルトで並列実行されます。以前の動作に戻すには、max_insert_threads を 1 に設定するか、compatibility 設定を使用します。
Cloud でのデフォルト値:
- メモリ 8 GiB のノードでは
1 - メモリ 16 GiB のノードでは
2 - より大きいノードでは
4
INSERT SELECT が有効なのは、SELECT 部分が並列に実行される場合のみです。max_threads 設定を参照してください。
通常の INSERT では、入力データは単一ストリームとして読み取り・解析され、その後、書き込みのためにパイプラインがこの数のストリームにリサイズされます。
書き込み側の並列化は、同期的な通常の INSERT にのみ適用されます。非同期挿入 (async_insert = 1) はキューに格納され、バックグラウンドでフラッシュされるため、この設定の影響を受けず、常に単一ストリームのままです。
書き込み側は、安全に並列化できる場合にのみ並列化されます。それ以外の場合は単一ストリームのままとなり、この設定は効果を持ちません。特に、use_strict_insert_block_limits が有効で、宛先テーブル (または宛先が転送するテーブル) が挿入ブロックを重複排除し、かつクエリで挿入の重複排除が有効な場合 (deduplicate_insert を参照) 、宛先に依存する materialized view がある場合 (宛先が転送するテーブルの view (たとえば Alias の背後にあるもの) も含む。ただし、parallel_view_processing が有効で、かつ依存 view チェーンに重複排除のリスクがない場合を除く。つまり、view 内の重複排除が無効 (deduplicate_blocks_in_dependent_materialized_views) であるか、依存 view のどのパスでも重複排除できない場合) 、および宛先が Buffer または Distributed の場合は常に、書き込みは単一ストリームに維持されます。Buffer は独自のコンテキストでフラッシュし、Distributed は書き込みをリモートシャードに転送します (リモートシャード自体がデータをバッファリングする場合があります) 。そのため、このクエリの重複排除設定は最終的な書き込みには適用されず、設定にかかわらず単一ストリームに維持されます。並列化されないクォーラム挿入 (insert_quorum が 2 以上または 'auto' であり、insert_quorum_parallel が無効) も、テーブルごとに処理中のクォーラム part を 1 つしか許可しないため、単一ストリームのままとなります。
値を大きくすると、メモリ使用量も増加します。
max_insert_threads_min_free_memory_per_thread
max_threads ではなく max_insert_threads に適用される点を除き、max_threads_min_free_memory_per_thread と同じです。既定値がより大きいのは、挿入パイプラインでは通常、読み取りパイプラインよりもスレッドごとに大きなバッファ (MergeTree のパーツ、圧縮ブロック) を保持するためです。
空きメモリ量が max_insert_threads にこの値を掛けた値を下回る場合、max_insert_threads はその範囲に収まるように減らされ、最小値は 1 です。
この制限を無効にするには、0 に設定します。