min(최소) 관련 설정

min(최소) 관련 설정

쿼리 처리의 다양한 측면에 대한 최소 임계값을 제어하는 min_* 설정들을 모아둔 문서예요. 병렬 파싱 청크 크기, 압축 블록 크기, 실행 속도, 쿼리 거부 비율, JOIN 행 저장 변환 등을 다룬답니다. 이 설정들은 system.settings 테이블에서 확인할 수 있고 소스 코드에서 자동 생성된 값들이에요.

출처: 문서

본문

이 설정들은 system.settings에서 확인할 수 있고, 소스 코드에서 자동 생성된 값들이에요.

min_chunk_bytes_for_parallel_parsing

  • 타입: unsigned int
  • 기본값: 1 MiB

각 스레드가 병렬로 파싱할 최소 청크 크기(바이트)예요.

min_compress_block_size

MergeTree 테이블용. 쿼리 처리 시 지연을 줄이기 위해, 블록의 크기가 min_compress_block_size 이상이면 다음 마크를 쓸 때 블록이 압축돼요. 기본값은 65,536이에요.

무압축 데이터가 max_compress_block_size보다 작으면 블록의 실제 크기는 이 값 이상이고 한 마크에 대한 데이터 양 이상이에요.

예를 들어 보겠어요. 테이블 생성 중 index_granularity가 8192로 설정되었다고 가정해 보세요. UInt32 타입 컬럼(값당 4바이트)을 쓰고 있다면, 8192행을 쓸 때 총 32KB의 데이터가 돼요. min_compress_block_size = 65,536이므로 매 두 마크마다 압축 블록이 형성돼요.

String 타입의 URL 컬럼(값당 평균 60바이트)을 쓰고 있다면, 8192행을 쓸 때 평균 약 500KB 미만의 데이터가 돼요. 이는 65,536보다 크므로 각 마크마다 압축 블록이 형성돼요. 이 경우 단일 마크 범위에서 디스크에서 데이터를 읽을 때 추가 데이터가 압축 해제되지 않아요.

이것은 전문가 수준의 설정이므로 ClickHouse를 이제 막 시작했다면 변경하지 않는 것이 좋아요.

min_filtered_ratio_for_lazy_final

지연 FINAL 최적화를 위해 인덱스 분석으로 필터링된 마크의 최소 비율이에요. 이 비율보다 적은 마크가 필터링되면 일반 FINAL로 되돌아가요. 값 0은 이 검사를 비활성화해요.

min_hit_rate_to_use_consecutive_keys_optimization

집계에서 연속 키 최적화에 사용되는 캐시의 최소 적중률로, 이를 유지하기 위한 값이에요.

min_os_cpu_wait_time_ratio_to_throw

쿼리 거부를 고려하는 OS CPU 대기(OSCPUWaitMicroseconds 메트릭)와 사용 중(OSCPUVirtualTimeMicroseconds 메트릭) 시간 사이의 최소 비율이에요. 최소·최대 비율 사이의 선형 보간을 사용해 확률을 계산하며, 이 지점에서 확률은 0이에요.

min_outstreams_per_resize_after_split

파이프라인 생성 중 분할이 수행된 후 Resize 또는 StrictResize 프로세서의 최소 출력 스트림 수를 지정해요. 결과 스트림 수가 이 값보다 적으면 분할 작업이 발생하지 않아요.

Resize 노드란 무엇인가

Resize 노드는 파이프라인을 흐르는 데이터 스트림 수를 조정하는 쿼리 파이프라인의 프로세서예요. 여러 스레드나 프로세서에 걸쳐 워크로드를 균형 있게 하기 위해 스트림 수를 늘리거나 줄일 수 있어요. 예를 들어 쿼리에 더 많은 병렬 처리가 필요하면 Resize 노드가 단일 스트림을 여러 스트림으로 나눌 수 있어요. 반대로 여러 스트림을 더 적은 스트림으로 병합해 데이터 처리를 통합할 수도 있어요.

Resize 노드는 데이터가 스트림 간에 고르게 분산되고 데이터 블록의 구조를 유지하도록 보장해요. 이는 리소스 이용을 최적화하고 쿼리 성능을 개선하는 데 도움이 돼요.

Resize 노드를 분할해야 하는 이유

파이프라인 실행 중 중앙 허브 역할을 하는 Resize 노드의 ExecutingGraph::Node::status_mutex는 특히 고코어 수 환경에서 심하게 경쟁하며, 이 경쟁은 다음으로 이어져요:

  • 쿼리 성능에 직접 영향을 주는 ExecutingGraph::updateNode의 지연 증가.
  • 스핀-락 경쟁(native_queued_spin_lock_slowpath)에서 과도한 CPU 사이클 낭비로 효율 저하.
  • 병렬 처리와 처리량을 제한하는 CPU 이용률 감소.

Resize 노드를 어떻게 분할하는가

분할이 수행될 수 있는지 출력 스트림 수를 확인해요. 각 분할 프로세서의 출력 스트림이 min_outstreams_per_resize_after_split 임계값을 충족하거나 초과해야 해요.

Resize 노드는 동일한 포트 수를 가진 더 작은 Resize 노드들로 나뉘며, 각각이 입력·출력 스트림의 일부를 처리해요. 각 그룹은 독립적으로 처리되어 잠금 경쟁을 줄여줘요.

임의의 입력/출력을 가진 Resize 노드 분할

어떤 경우에는 입력/출력이 분할된 Resize 노드 수로 나눠지지 않을 때, 일부 입력은 NullSource에, 일부 출력은 NullSink에 연결돼요. 이렇게 하면 전체 데이터 흐름에 영향을 주지 않고 분할이 발생할 수 있어요.

설정의 목적

min_outstreams_per_resize_after_split 설정은 Resize 노드의 분할이 의미가 있고, 비효율적인 병렬 처리를 초래할 수 있는 너무 적은 스트림을 만들지 않도록 보장해요. 최소 출력 스트림 수를 강제함으로써 이 설정은 병렬 처리와 오버헤드 사이의 균형을 유지해 스트림 분할 및 병합이 관련된 시나리오에서 쿼리 실행을 최적화하는 데 도움이 돼요.

설정 비활성화

Resize 노드 분할을 비활성화하려면 이 설정을 0으로 설정하세요. 이는 파이프라인 생성 중 Resize 노드의 분할을 방지하여 더 작은 노드로 나누지 않고 원래 구조를 유지하게 해요.

min_rows_ratio_for_hash_join_row_store

해시 조인 페이로드를 행-우선으로 변환하는 것을 활성화하기 위한, 빌드 측 행에 대한 조인 출력 행의 최소 추정 비율이에요. 0은 변환이 항상 허용됨을 의미해요.

min_table_rows_to_use_projection_index

테이블에서 읽을 추정 행 수가 이 임계값보다 크거나 같으면 ClickHouse가 쿼리 실행 중 프로젝션 인덱스를 사용하려 해요.

더 알아보기 (Learn more)