MergeTree 읽기 관련 설정

MergeTree 읽기 관련 설정

MergeTree 테이블에서 데이터를 읽는 방식을 세밀하게 제어하는 설정들이에요. 코스 인덱스 그라뉼러리티, 캐시 사용, 동시 읽기 임계값, read task 크기, 프리페치 등을 다룬답니다. 이 설정들은 system.settings 테이블에서 확인할 수 있고 소스 코드에서 자동 생성된 값들이에요.

출처: 문서

본문

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

merge_tree_coarse_index_granularity

데이터를 검색할 때 ClickHouse는 인덱스 파일에서 데이터 마크를 확인해요. ClickHouse가 필수 키가 어떤 범위에 있다는 것을 발견하면 이 범위를 merge_tree_coarse_index_granularity개의 하위 범위로 나누고 그곳에서 필수 키를 재귀적으로 검색해요.

가능한 값: 임의의 양의 짝수 정수.

merge_tree_compact_parts_min_granules_to_multibuffer_read

ClickHouse Cloud에서만 효과가 있어요. 병렬 읽기와 프리페치를 지원하는 멀티버퍼 리더를 사용할 MergeTree 테이블의 컴팩트 파트 스트라이프의 그라뉼 수예요. 원격 파일 시스템에서 읽을 때 멀티버퍼 리더를 사용하면 읽기 요청 수가 늘어나요. 파트에 이 임계값보다 적은 그라뉼과 읽는 컬럼 수보다 적은 그라뉼이 모두 포함되면 단일 버퍼로 읽혀요. 그 경우 단일 버퍼 리더가 멀티버퍼 리더보다 더 적은 읽기 요청을 발행하기 때문이에요.

merge_tree_determine_task_size_by_prewhere_columns

읽기 태스크 크기를 결정할 때 prewhere 컬럼 크기만 사용할지 여부예요.

merge_tree_generic_exclusion_search_max_steps

필터가 프라이머리 키의 단일 연속 범위로 평가될 수 없을 때(예: 첫 번째가 아닌 다른 키 컬럼을 사용할 때) ClickHouse는 인덱스 마크에 대해 반복적인 일반 배제 검색 알고리즘을 실행해요. 텍스트 인덱스 분석에도 같은 알고리즘이 사용돼요. 이 설정은 알고리즘이 각 데이터 파트에 쓰는 단계(인덱스 검사) 수를 제한해요.

예산은 가장 큰 남은 마크 범위에 먼저 사용돼요. 예산이 소진되면 완전히 분석되지 않은 범위가 통째로 수용되므로 쿼리는 정확하지만 무제한 검색이 선택하는 것보다 더 많은 그라뉼을 읽을 수 있어요. 더 낮은 예산은 더 많은 데이터를 읽는 대가로 인덱스 분석을 빠르게 해요. 이 제한은 엄격한 캡이라기보다 근사치예요. 검색은 대략 한 번의 분할 라운드만큼 초과할 수 있고, 파트가 이미 여러 범위로 나뉘어 있으면(예: 쿼리 조건 캐시에 의해) 각 범위는 제한과 무관하게 적어도 한 번은 검사돼요.

검색이 각 데이터 파트에 만든 단계 수는 쿼리의 trace 레벨 로그 메시지에 보고되고, IndexGenericExclusionSearchStepLimitReachedTextIndexGenericExclusionSearchStepLimitReached 프로필 이벤트가 예산이 소진된 횟수를 셈해요.

(기본) 값 0은 무제한 단계를 의미해요.

가능한 값: 0(무제한 단계) 또는 임의의 양의 정수.

merge_tree_max_bytes_to_use_cache

ClickHouse가 한 쿼리에서 merge_tree_max_bytes_to_use_cache 바이트보다 많이 읽어야 하면 무압축 블록 캐시를 사용하지 않아요. 무압축 블록 캐시는 쿼리에 대해 추출된 데이터를 저장해요. ClickHouse는 이 캐시를 사용해 반복되는 작은 쿼리에 대한 응답을 빠르게 해요. 이 설정은 많은 양의 데이터를 읽는 쿼리가 캐시를 파괴하지 않도록 보호해요. uncompressed_cache_size 서버 설정이 무압축 블록 캐시의 크기를 정의해요.

가능한 값: 임의의 양의 정수.

merge_tree_max_rows_to_use_cache

ClickHouse가 한 쿼리에서 merge_tree_max_rows_to_use_cache 행보다 많이 읽어야 하면 무압축 블록 캐시를 사용하지 않아요. 무압축 블록 캐시는 쿼리에 대해 추출된 데이터를 저장해요. ClickHouse는 이 캐시를 사용해 반복되는 작은 쿼리에 대한 응답을 빠르게 해요. 이 설정은 많은 양의 데이터를 읽는 쿼리가 캐시를 파괴하지 않도록 보호해요. uncompressed_cache_size 서버 설정이 무압축 블록 캐시의 크기를 정의해요.

가능한 값: 임의의 양의 정수.

merge_tree_min_bytes_for_concurrent_read

MergeTree 엔진 테이블의 한 파일에서 읽을 바이트 수가 merge_tree_min_bytes_for_concurrent_read를 초과하면 ClickHouse는 이 파일에서 여러 스레드로 동시에 읽으려 해요.

가능한 값: 양의 정수.

merge_tree_min_bytes_for_concurrent_read_for_remote_filesystem

원격 파일 시스템에서 읽을 때 MergeTree 엔진이 읽기를 병렬화할 수 있기 전에 한 파일에서 읽어야 하는 최소 바이트 수예요. 이 설정을 사용하는 것은 권장하지 않아요.

가능한 값: 양의 정수.

merge_tree_min_bytes_for_seek

한 파일에서 읽을 두 데이터 블록 사이의 거리가 merge_tree_min_bytes_for_seek 바이트보다 작으면 ClickHouse는 두 블록을 모두 포함하는 파일 범위를 순차적으로 읽어 추가 seek을 피해요.

가능한 값: 임의의 양의 정수.

merge_tree_min_bytes_per_read_stream

byte-등가로 표현된 스트림별 오버헤드 비용이에요. 일반적인 로컬 무순서 MergeTree 스캔에 대해 생성되는 최대 읽기 스트림 수를 제어해요. 순서 있는, FINAL, 계층형, 병렬 레플리카 읽기는 변경되지 않아요.

볼륨 기반 캡은 ceil(sqrt(estimated_read_bytes / this_setting))이에요. ClickHouse는 또한 적어도 16개 스트림과 이 캡 전에 요청된 스트림의 4분의 1을 보존하므로, 유효 스트림 수는 min(requested_streams, max(volume_based_cap, 16, floor(requested_streams / 4)))이에요. 이 하한들은 CPU가 많이 드는 표현식과 집계에 대한 하류 병렬 처리를 보존하는데, 그 비용은 estimated_read_bytes로 표현되지 않아요.

estimated_read_bytes는 인덱스와 파티션 가지치기 후 남은 마크 범위에 대해 읽히는 컬럼의 무압축 크기예요. 무압축 크기가 사용되는 이유는 스트림별 오버헤드가 스트림당 수행되는 작업과 교환되는데, 그 작업은 압축이 얼마나 잘되는지보다 처리되는 값 수에 비례하기 때문이에요.

읽기 볼륨을 보수적으로 추정할 수 없을 때 캡은 적용되지 않아요. 예를 들어 오래된 파트가 새로 추가된 DEFAULT 컬럼을 평가하기 위해 다른 물리 컬럼을 필요로 하거나, 선택된 범위가 가변 너비 컬럼의 일부만 읽을 때요.

기본값 64 KB는 비용 모델 T(N) = W/N + F + V·N에서 파생되는데, W는 유용한 작업, F는 고정 파이프라인 오버헤드, V는 스트림별 가변 비용이에요. 최적 스트림 수는 sqrt(W/V)이에요. W를 처리량으로 바이트로 표현하면 C = throughput · V ≈ 400 MB/s · 0.17 ms ≈ 64 KB가 돼요. 이 값을 늘리면 스트림 수가 줄어들고(더 보수적), 줄이면 더 많은 스트림을 허용해요. 이 최적화를 비활성화하려면 0으로 설정하세요.

가능한 값: 음이 아닌 정수.

merge_tree_min_bytes_per_task_for_remote_reading

별칭: filesystem_prefetch_min_bytes_for_single_read_task

태스크당 읽을 최소 바이트예요.

merge_tree_min_read_task_size

태스크 크기의 하드 하한이에요(그라뉼 수가 적고 사용 가능한 스레드 수가 많아도 더 작은 태스크를 할당하지 않음).

merge_tree_min_rows_for_concurrent_read

MergeTree 테이블의 파일에서 읽을 행 수가 merge_tree_min_rows_for_concurrent_read를 초과하면 ClickHouse는 이 파일에서 여러 스레드로 동시 읽기를 수행하려 해요.

가능한 값: 양의 정수.

merge_tree_min_rows_for_concurrent_read_for_remote_filesystem

원격 파일 시스템에서 읽을 때 MergeTree 엔진이 읽기를 병렬화할 수 있기 전에 한 파일에서 읽어야 하는 최소 행 수예요. 이 설정을 사용하는 것은 권장하지 않아요.

가능한 값: 양의 정수.

merge_tree_min_rows_for_seek

한 파일에서 읽을 두 데이터 블록 사이의 거리가 merge_tree_min_rows_for_seek 행보다 작으면 ClickHouse는 파일을 통해 seek하지 않고 데이터를 순차적으로 읽어요.

가능한 값: 임의의 양의 정수.

merge_tree_prefetch_json_shared_data_substreams

mark로 seek하여 읽는 Wide 파트에서 JSON 공유 데이터 서브스트림의 프리페치를 활성화해요. 그러한 프리페치는 보통 서브스트림이 읽히는 위치가 아닌 그라뉼의 시작에서 읽으므로 낭비될 수 있어요. 이러한 프리페치를 건너뛰려면 비활성화하세요.

merge_tree_read_split_ranges_into_intersecting_and_non_intersecting_injection_probability

PartsSplitter 테스트용으로, 지정된 확률로 MergeTree에서 읽을 때마다 읽기 범위를 교차하는 것과 교차하지 않는 것으로 나눠요.

merge_tree_storage_snapshot_sleep_ms

MergeTree 테이블의 스토리지 스냅샷을 만들 때 인위적인 지연(밀리초)을 주입해요. 테스트와 디버깅 목적으로만 사용돼요.

가능한 값:

  • 0 - 지연 없음(기본값)
  • N - 지연(밀리초)

merge_tree_use_const_size_tasks_for_remote_reading

원격 테이블에서 읽을 때 고정 크기 태스크를 사용할지 여부예요.

merge_tree_use_deserialization_prefixes_cache

MergeTree에서 원격 디스크에서 읽는 동안 파일 접두사에서 컬럼 메타데이터의 캐싱을 활성화해요.

merge_tree_use_prefixes_deserialization_thread_pool

MergeTree의 Wide 파트에서 병렬 접두사 읽기를 위한 스레드 풀 사용을 활성화해요. 그 스레드 풀의 크기는 서버 설정 max_prefixes_deserialization_thread_pool_size로 제어돼요.

merge_tree_use_v1_object_and_dynamic_serialization

활성화하면 MergeTree에서 JSON과 Dynamic 타입의 V1 직렬화 버전이 V2 대신 사용돼요. 이 설정을 변경하는 것은 서버 재시작 후에만 효과가 있어요.

더 알아보기 (Learn more)