분산 쿼리 계획 관련 설정

분산 쿼리 계획 관련 설정

이번에는 ClickHouse의 분산 쿼리 계획(distributed query plan)과 관련된 세션 설정들을 다룬답니다. 분산 테이블을 사용할 때 읽기 태스크 수, 셔플 조인 버킷 수, 로컬 실행 여부 등을 세밀하게 조절할 수 있어요. 이 설정들은 system.settings 테이블에서 확인할 수 있으며 소스 코드에서 자동 생성된 값들이랍니다.

출처: 문서

본문

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

distributed_plan_default_reader_bucket_count

분산 쿼리에서 병렬 읽기를 위한 기본 태스크 수를 나타내요. 태스크들은 여러 레플리카에 걸쳐 분산되어 실행된답니다.

규칙 기반 분산 플래너(rule-based distributed planner)가 사용하는 값이에요. 비용 기반 옵티마이저(cost-based optimizer)는 예상 비용을 바탕으로 읽기 fan-out을 선택하므로 이 설정을 사용하지 않아요.

distributed_plan_default_shuffle_join_bucket_count

분산 셔플-해시-조인(distributed shuffle-hash-join)을 위한 기본 버킷 수를 나타내요.

규칙 기반 분산 플래너가 사용하는 값으로, 비용 기반 옵티마이저는 예상 비용을 기준으로 fan-out을 선택하므로 이 설정을 사용하지 않아요.

distributed_plan_execute_locally

분산 쿼리 계획의 모든 태스크를 로컬에서 실행해요. 테스트와 디버깅에 유용하답니다.

distributed_plan_fallback_to_local_execution

쿼리 계획에 분산 실행을 지원하지 않는 단계가 있을 때, 그 이유를 로그에 기록하고 예외를 던지는 대신 initiator에서 쿼리를 실행해요. 예외를 받으려면 이 설정을 끄면 되죠. make_distributed_plan(프라이빗 프리뷰)이 활성화된 경우에만 적용된답니다.

distributed_plan_force_exchange_kind

분산 쿼리 단계 사이에서 특정 종류의 Exchange 오퍼레이터를 강제로 사용해요.

가능한 값은 다음과 같아요:

  • 빈 값 — 어떤 Exchange 오퍼레이터도 강제하지 않고, 옵티마이저가 선택하게 해요.
  • Persisted — 오브젝트 스토리지의 임시 파일을 사용해요.
  • Streaming — 네트워크를 통해 Exchange 데이터를 스트리밍해요.

distributed_plan_force_shuffle_aggregation

분산 쿼리 계획에서 PartialAggregation + Merge 대신 Shuffle 집계 전략을 사용해요.

Shuffle 전략이 올바른 결과를 만들 수 없는 경우(예: GROUPING SETS 또는 집계 결과가 버킷 순서로 생성되어야 하는 경우)에는 무시된답니다.

distributed_plan_max_rows_to_broadcast

분산 쿼리 계획에서 셔플 조인 대신 브로드캐스트 조인을 사용할 수 있는 최대 행 수를 나타내요.

규칙 기반 분산 플래너를 위한 휴리스틱이에요. 비용 기반 옵티마이저가 활성화되면 브로드캐스트 대 셔플 선택이 예상 비용으로 결정되므로 이 설정은 효과가 없어요.

distributed_plan_optimize_exchanges

분산 쿼리 계획에서 불필요한 exchange를 제거해요. 디버깅할 때는 끄면 된답니다.

distributed_plan_prefer_replicas_over_workers

분산 쿼리 계획을 레플리카에서 실행하도록 직렬화해요.

distributed_plan_read_in_order

분산 쿼리 계획에서 ORDER BY에 대한 read-in-order 최적화를 허용해요. 이를 통해 테이블의 정렬 키를 정렬된 채로 읽으면 스캔과 정렬을 건너뛰고 일찍 멈출 수 있답니다.

기본값은 꺼져 있어요. 정렬을 분산하는 재작성은 자신이 감싸는 정렬이 입력의 정렬됨에 의존하지 않는다고 가정하는데, 순서를 보존하지 않는 exchange를 통해 입력이 공급되면 문제가 생길 수 있거든요. 현재는 읽기와 정렬 사이에 exchange가 남지 않는 형태만 안전해요.

distributed_plan_workers_num

이 쿼리를 실행하는 데 사용할 stateless 워커의 수를 나타내요. 0이면 분산 계획의 stateless 워커 대여를 비활성화해요.

distributed_plan_workers_provisioning_timeout_ms

쿼리가 실행 전에 stateless 워커를 프로비저닝하는 데 쓸 수 있는 총 벽시계 시간(밀리초)을 나타내요. 워커를 디스커버리 서비스에서 대여하고 연결 가능한지 검증하는 과정이지요. 쿼리는 대여한 워커가 준비될 때까지 이 예산만큼 블록되고, 예산이 지나면 지금까지 검증된 워커로 진행하거나 아무 워커도 준비되지 않았다면 실패해요. 0이면 초기 대여-검증 한 번만 기다려요(재시도 없음).

더 알아보기 (Learn more)