최대 바이트 관련 설정
최대 바이트 관련 설정
외부 정렬·집계·조인·DISTINCT, 읽기, 전송 등 다양한 작업에서 최대 바이트 수를 제어하는 설정들이에요. 메모리 사용을 제한하고 필요시 디스크로 spill하는 데 유용하답니다. 이 설정들은 system.settings 테이블에서 확인할 수 있고 소스 코드에서 자동 생성된 값들이에요.
출처: 문서
본문
이 설정들은 system.settings에서 확인할 수 있고, 소스 코드에서 자동 생성된 값들이에요.
max_bytes_before_external_distinct
DISTINCT 데이터를 디스크로 spill하기 위한 쿼리 메모리 임계값(바이트)이에요. 실제 메모리 사용량은 이 임계값을 초과할 수 있어요. 0은 이 임계값을 비활성화해요. max_bytes_ratio_before_external_distinct도 임계값을 제공하면 더 작은 값이 사용돼요. spill을 완전히 비활성화하려면 두 설정을 모두 0으로 설정하세요. 외부 메모리의 DISTINCT 참조.
max_bytes_before_external_group_by
클라우드 기본값: 레플리카당 메모리 양의 절반.
GROUP BY 절을 외부 메모리에서 실행할지 여부를 활성화하거나 비활성화해요. (외부 메모리의 GROUP BY 참조)
가능한 값:
- 단일 GROUP BY 작업이 사용할 수 있는 최대 RAM 용량(바이트).
0— 외부 메모리의GROUP BY비활성화.
GROUP BY 작업 중 메모리 사용량이 이 임계값(바이트)을 초과하면 'external aggregation' 모드(데이터를 디스크로 spill)를 활성화해요. 권장 값은 사용 가능한 시스템 메모리의 절반이에요.
max_bytes_before_external_join
0이 아닌 값으로 설정하면 오른쪽 데이터가 이 바이트 수를 초과할 때 해시 조인이 디스크로 spill할 수 있도록 grace hash join으로 자동 변환돼요. max_bytes_ratio_before_external_join과 함께 이는 모든 해시 기반 join_algorithm의 임계값 기반 spill 트리거예요. grace_hash도 포함되며, 두 값 중 하나는 0이 아니어야 해요. 0이 아닌 임계값이 조인을 spill 가능하게 만들면 enable_adaptive_memory_spill_scheduler가 임계값에 도달하기 전에 메모리 압박 아래에서 강제로 spill할 수 있어요. 두 설정이 모두 0이면 조인은 결코 spill하지 않으므로 스케줄러가 트리거할 것이 없어요. 예외는 legacy_join_size_limits_trigger_spilling이에요. 이것이 켜져 있으면 독립형 grace_hash는 둘 다 무시하고 max_rows_in_join / max_bytes_in_join으로 spill해요. 0(기본값)으로 설정하면 이 절대 바이트 임계값은 비활성화되지만 max_bytes_ratio_before_external_join(기본값 0.5)을 통해 자동 spill이 여전히 발생할 수 있어요. 완전히 비활성화하려면 둘 다 0으로 설정하세요. 이는 조인 최적화를 통한 순서대로 읽기를 방지해요.
max_bytes_before_external_sort
클라우드 기본값: 레플리카당 메모리 양의 절반.
ORDER BY 절을 외부 메모리에서 실행할지 여부를 활성화하거나 비활성화해요. ORDER BY 구현 세부 사항 참조.
ORDER BY 작업 중 메모리 사용량이 이 임계값(바이트)을 초과하면 'external sorting' 모드(데이터를 디스크로 spill)가 활성화돼요.
가능한 값:
- 단일 ORDER BY 작업이 사용할 수 있는 최대 RAM 용량(바이트).
- 권장 값은 사용 가능한 시스템 메모리의 절반이에요.
0— 외부 메모리의ORDER BY비활성화.
max_bytes_before_remerge_sort
ORDER BY with LIMIT의 경우 메모리 사용량이 지정된 임계값보다 높으면 최종 병합 전에 블록 병합의 추가 단계를 수행해 상위 LIMIT 행만 유지해요.
max_bytes_for_lazy_final
지연 FINAL 최적화를 위한 집합의 최대 바이트 수예요. 초과하면 일반 FINAL로 되돌아가요.
max_bytes_in_distinct
DISTINCT를 사용할 때 해시 테이블이 사용하는 메모리의 상태 최대 바이트 수(무압축 바이트)예요.
max_bytes_in_join
테이블을 조인할 때 사용되는 오른쪽 데이터 구조(보통 해시 테이블)의 최대 크기(바이트)예요. 이 설정은 SELECT … JOIN 작업과 Join 테이블 엔진에 적용돼요.
쿼리에 여러 조인이 포함되면 ClickHouse는 모든 중간 결과에 대해 이 설정을 확인해요. 모든 해시 기반 join_algorithm에 대한 하드 캡이에요. 한도에 도달하면 join_overflow_mode에 따라 쿼리가 throw하거나 break해요.
조인이 디스크로 spill하게 만들지는 않아요. 그 결정은 max_bytes_before_external_join과 max_bytes_ratio_before_external_join에 속해요. 캡이지 트리거가 아니므로, 캡을 spill 임계값 이하로 설정하면 보통 조인이 spill하기 전에 쿼리가 실패해요. 단, 조인이 spill 가능하고 enable_adaptive_memory_spill_scheduler가 먼저 spill을 강제하는 경우, 또는 legacy_join_size_limits_trigger_spilling이 이미 디스크에서 실행 중인 조인 부분에 대해 이 한도를 다시 spill 트리거로 바꾸는 경우는 예외예요.
이 한도는 해시 테이블이 보유한 것을 계산하므로, spill한 조인은 오른쪽을 읽는 동안이 아니라 각 버킷이 로드될 때 도달해요. 인-메모리 해시 조인보다 멈추기 전에 오른쪽을 더 많이 읽을 수 있어요.
가능한 값:
- 양의 정수.
- 0 — 메모리 제어 비활성화.
max_bytes_in_set
서브쿼리에서 생성된 IN 절의 집합이 사용하는 최대 바이트 수(무압축 데이터)예요.
max_bytes_ratio_before_external_distinct
실행 시작 시 외부 DISTINCT 임계값을 계산하는 데 사용되는 사용 가능한 서버 또는 사용자 메모리의 비율이에요. 예를 들어 0.5는 사용 가능한 메모리의 절반을 사용해요. 값은 적어도 0 이상이고 1 미만이어야 해요. 0은 이 임계값을 비활성화해요. 적용 가능한 서버나 사용자 메모리 한도가 없으면 비율은 효과가 없어요. max_memory_usage는 이 계산에 영향을 주지 않아요. 그 한도에 상대적으로 spill을 구성하려면 max_bytes_before_external_distinct를 사용해 추가 메모리 사용을 위한 여지를 두세요.
max_bytes_ratio_before_external_group_by
GROUP BY에 허용되는 사용 가능한 메모리의 비율이에요. 도달하면 집계에 외부 메모리가 사용돼요. 예를 들어 0.6으로 설정하면 GROUP BY가 실행 시작 시 사용 가능한 메모리(서버/사용자/병합에 대한)의 60%를 사용하도록 허용하고, 그 후에는 외부 집계를 사용하기 시작해요.
max_bytes_ratio_before_external_join
JOIN에 허용되는 사용 가능한 메모리의 비율이에요. 도달하면 해시 조인이 grace hash join으로 변환되어 오른쪽 데이터를 디스크로 spill해요. 예를 들어 0.6으로 설정하면 JOIN이 실행 시작 시 사용 가능한 메모리(서버/사용자/병합에 대한)의 60%를 오른쪽 해시 테이블에 사용하도록 허용하고, 그 후에는 디스크로 spill하기 시작해요.
max_bytes_before_external_join과 max_bytes_ratio_before_external_join이 모두 설정되면 더 작은 결과 임계값이 사용돼요. 비율이 0이면 절대 설정만 적용돼요. 임시 데이터 경로가 구성되면 모든 해시 기반 join_algorithm에 효과가 있어요(grace_hash 포함).
max_bytes_ratio_before_external_sort
ORDER BY에 허용되는 사용 가능한 메모리의 비율이에요. 도달하면 외부 정렬이 사용돼요. 예를 들어 0.6으로 설정하면 ORDER BY가 실행 시작 시 사용 가능한 메모리(서버/사용자/병합에 대한)의 60%를 사용하도록 허용하고, 그 후에는 외부 정렬을 사용하기 시작해요. max_bytes_before_external_sort는 여전히 존중된다는 점에 유의하세요. 정렬 블록이 max_bytes_before_external_sort보다 큰 경우에만 디스크로의 spill이 이루어져요.
max_bytes_to_read
쿼리 실행 중 테이블에서 읽을 수 있는 최대 바이트 수(무압축 데이터)예요. 제한은 처리된 각 데이터 청크에 대해 확인되고, 가장 깊은 테이블 표현식에만 적용되며, 원격 서버에서 읽을 때는 원격 서버에서만 확인돼요.
max_bytes_to_read_leaf
분산 쿼리 실행 중 리프 노드의 로컬 테이블에서 읽을 수 있는 최대 바이트 수(무압축 데이터)예요. 분산 쿼리는 각 샤드(리프)에 여러 하위 쿼리를 발행할 수 있지만, 이 제한은 리프 노드의 읽기 단계에서만 확인되고 루트 노드의 결과 병합 단계에서는 무시돼요.
예를 들어 클러스터가 2개 샤드로 구성되고 각 샤드에 100바이트 데이터의 테이블이 있다고 해보세요. 두 테이블의 모든 데이터를 읽어야 하는 분산 쿼리는 max_bytes_to_read=150으로는 총 200바이트가 되므로 실패해요. max_bytes_to_read_leaf=150인 쿼리는 리프 노드가 최대 100바이트를 읽으므로 성공해요.
제한은 처리된 각 데이터 청크에 대해 확인돼요. 이 설정은 prefer_localhost_replica=1에서 불안정해요.
max_bytes_to_sort
정렬 전 최대 바이트 수예요. ORDER BY 작업을 위해 지정된 양보다 많은 무압축 바이트를 처리해야 하면 동작은 기본값이 throw인 sort_overflow_mode로 결정돼요.
max_bytes_to_transfer
GLOBAL IN/JOIN 섹션이 실행될 때 원격 서버로 전달되거나 임시 테이블에 저장될 수 있는 최대 바이트 수(무압축 데이터)예요.