max_insert_block_size
max_insert_block_size_rows
테이블에 삽입할 블록의 최대 크기(행 수 기준)를 지정합니다.
이 설정은 다음 두 가지 상황에서 블록 형성을 제어합니다.
-
포맷 파싱: 서버가 임의의 인터페이스(HTTP, inline 데이터가 포함된 clickhouse-client, gRPC, PostgreSQL wire 프로토콜)를 통해 행 기반 입력 형식(CSV, TSV, JSONEachRow 등)을 파싱할 때, 다음 조건에서 블록이 생성됩니다.
- min_insert_block_size_rows AND min_insert_block_size_bytes를 모두 만족한 경우, OR
- max_insert_block_size_rows OR max_insert_block_size_bytes 중 하나를 만족한 경우
-
INSERT 작업: INSERT 쿼리 실행 중이거나 데이터가 구체화된 뷰(Materialized View)를 통과할 때, 이 설정의 동작은
use_strict_insert_block_limits값에 따라 달라집니다.-
활성화된 경우: 다음 조건에서 블록이 생성됩니다.
- 최소 임계값(AND): min_insert_block_size_rows AND min_insert_block_size_bytes를 모두 만족
- 최대 임계값(OR): max_insert_block_size_rows OR max_insert_block_size_bytes 중 하나를 만족
- 비활성화된 경우: min_insert_block_size_rows OR 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가 있는 경우(예: Alias 뒤에 있는 대상이 데이터를 전달하는 테이블의 view 포함)에는 쓰기가 단일 스트림으로 유지됩니다. 단, parallel_view_processing이 활성화되어 있고 종속 view 체인에 중복 제거 위험이 없는 경우(views의 중복 제거가 비활성화됨(deduplicate_blocks_in_dependent_materialized_views) 또는 어떤 종속 view 경로에서도 중복을 제거할 수 없음)는 예외입니다. 또한 Buffer 및 Distributed 대상에서는 항상 단일 스트림으로 유지됩니다. Buffer는 자체 Context에서 플러시하고 Distributed는 쓰기 작업을 원격 샤드로 전달합니다(원격 샤드에서 데이터를 버퍼링할 수 있음). 따라서 이 쿼리의 중복 제거 설정은 최종 쓰기에 적용되지 않으며, 해당 설정과 관계없이 단일 스트림으로 유지됩니다. 병렬이 아닌 쿼럼 삽입(insert_quorum이 2 이상이거나 'auto'이고 insert_quorum_parallel이 비활성화된 경우)도 테이블당 진행 중인 쿼럼 파트를 하나만 허용하므로 단일 스트림으로 유지됩니다.
값이 클수록 메모리 사용량이 증가합니다.
max_insert_threads_min_free_memory_per_thread
max_threads_min_free_memory_per_thread와 동일하지만, max_threads가 아니라 max_insert_threads에 적용됩니다. 기본값이 더 큰 이유는 삽입 파이프라인이 일반적으로 읽기 파이프라인보다 스레드별로 더 큰 버퍼(MergeTree 파트, 압축 블록)를 보유하기 때문입니다.
여유 메모리 양이 max_insert_threads에 이 값을 곱한 값보다 적으면, max_insert_threads는 이에 맞게 최소 1까지 줄어듭니다.
이 제한을 비활성화하려면 0으로 설정하십시오.