optimize_* 세션 설정

optimize_* 세션 설정

이 페이지에서는 다양한 optimize_* 세션 설정들을 다뤄요. 쿼리 최적화, 데이터 읽기 최적화, 표현식 재작성, 변경 프루닝 등 ClickHouse의 여러 최적화 동작을 제어해요. 이 설정들은 system.settings 테이블에서 확인할 수 있으며 ClickHouse 소스에서 자동 생성돼요.

출처: 문서

본문

이 설정들은 system.settings에서 확인할 수 있으며 소스에서 자동 생성돼요.

optimize_aggregators_of_group_by_keys

SELECT 절에서 GROUP BY 키의 min/max/any/anyLast 집계기를 제거해요.

optimize_append_index

인덱스 조건을 추가하기 위해 constraints를 사용해요. 기본값은 false예요. 가능한 값:

  • true, false.

optimize_arithmetic_operations_in_aggregate_functions

산술 연산을 집계 함수 밖으로 이동해요.

optimize_const_name_size

큰 상수를 스칼라로 대체하고 이름으로 해시를 사용해요(크기는 이름 길이로 추정). 가능한 값:

  • 양의 정수 - 이름의 최대 길이,

  • 0 — 항상,

  • 음의 정수 - 절대.

optimize_count_from_files

다양한 입력 형식의 파일에서 행 수를 세는 최적화를 활성화 또는 비활성화해요. file/s3/url/hdfs/azureBlobStorage 테이블 함수/엔진에 적용돼요. 가능한 값:

  • 0 — 최적화 비활성화.

  • 1 — 최적화 활성화.

optimize_dictget_tuple_element

tupleElement(dictGet('dict', ('a', 'b', 'c'), key), 2)dictGet('dict', 'b', key)로 재작성하여 불필요한 사전 속성 가져오기를 피해요. 위치(.1, .2, ...) 및 이름(.b) 접근을 지원하며, 기본 인자가 상수 튜플 또는 상수의 tuple(...)일 때 dictGetOrDefault에도 적용돼요.

optimize_distinct_in_order

DISTINCT의 일부 컬럼이 정렬 접두사를 이루면 DISTINCT 최적화를 활성화해요. 예를 들어 MergeTree의 정렬 키 접두사 또는 ORDER BY 문이 접두사를 이룰 때요.

optimize_distributed_group_by_sharding_key

이니시에이터 서버의 비용이 큰 집계를 피함으로써 GROUP BY sharding_key 쿼리를 최적화해요(이니시에이터 서버의 쿼리 메모리 사용량을 줄임). 다음 유형의 쿼리가 지원돼요(그리고 그 조합도 모두):

  • SELECT DISTINCT [..., ]sharding_key[, ...] FROM dist

  • SELECT ... FROM dist GROUP BY sharding_key[, ...]

  • SELECT ... FROM dist GROUP BY sharding_key[, ...] ORDER BY x

  • SELECT ... FROM dist GROUP BY sharding_key[, ...] LIMIT 1

  • SELECT ... FROM dist GROUP BY sharding_key[, ...] LIMIT 1 BY x

다음 유형의 쿼리는 지원되지 않아요(일부는 나중에 지원될 수 있음):

  • SELECT ... GROUP BY sharding_key[, ...] WITH TOTALS

  • SELECT ... GROUP BY sharding_key[, ...] WITH ROLLUP

  • SELECT ... GROUP BY sharding_key[, ...] WITH CUBE

  • SELECT ... GROUP BY sharding_key[, ...] SETTINGS extremes=1

가능한 값:

  • 0 — 비활성화.

  • 1 — 활성화.

함께 보기:

현재는 optimize_skip_unused_shards가 필요해요(그 이유는 언젠가 기본으로 활성화될 수 있는데, 데이터가 Distributed 테이블을 통해 삽입된 경우, 즉 데이터가 sharding_key에 따라 분산된 경우에만 올바르게 동작하기 때문이에요).

optimize_dry_run_check_part

활성화하면 OPTIMIZE ... DRY RUNcheckDataPart로 결과 병합 파트를 검증해요. 검사가 실패하면 예외가 발생해요.

optimize_empty_string_comparisons

col = '''' = col 같은 표현식을 empty(col)로, col != '''' != colnotEmpty(col)로 변환해요. colString 또는 FixedString 타입일 때만 적용돼요.

optimize_extract_common_expressions

WHERE, PREWHERE, ON, HAVING, QUALIFY 표현식의 접속(disjunction)에서 공통 표현식을 추출할 수 있게 해요. (A AND B) OR (A AND C) 같은 논리 표현식은 A AND (B OR C)로 재작성될 수 있으며, 이는 다음을 활용하는 데 도움을 줄 수 있어요:

  • 단순 필터링 표현식의 인덱스

  • cross to inner join 최적화

optimize_functions_to_subcolumns

일부 함수를 서브컬럼 읽기로 변환하여 최적화를 활성화 또는 비활성화해요. 읽는 데이터 양을 줄여요. 변환될 수 있는 함수:

가능한 값:

  • 0 — 최적화 비활성화.

  • 1 — 최적화 활성화.

optimize_inverse_dictionary_lookup

미리 계산된 가능한 키 값 집합에 대한 더 빠른 조회로 반복적인 역 사전 조회를 피해요.

optimize_multiif_to_if

조건이 하나만 있는 multiIfif로 대체해요.

optimize_mutations_with_partition_pruning

활성화하면 ClickHouse가 ReplicatedMergeTree 계열 테이블의 ALTER TABLE UPDATE/DELETE 변경과 경량 UPDATE/DELETE 문의 WHERE 절에서 파티션 키 조건을 자동으로 감지하고, 모든 파티션 대신 영향받는 파티션만 처리해요. 이 자동 프루닝은 현재 복제 테이블에만 적용돼요. 비복제 MergeTree 테이블에서는 명시적 IN PARTITION 절을 사용해 변경을 특정 파티션으로 제한해요. 가능한 값:

  • 0 — 비활성화. 변경과 경량 업데이트가 모든 파티션을 처리해요.

  • 1 — 활성화. 변경과 경량 업데이트가 WHERE 조건과 일치하는 파티션만 처리해요.

optimize_normalize_count_variants

의미상 count()와 같은 집계 함수를 count()로 재작성해요.

optimize_on_insert

테이블 엔진에 따라 이 블록에서 병합이 수행된 것처럼 삽입 전에 데이터 변환을 활성화 또는 비활성화해요. 가능한 값:

  • 0 — 비활성화.

  • 1 — 활성화.

예시 활성화와 비활성화의 차이: 쿼리:

SET optimize_on_insert = 1;

CREATE TABLE test1 (`FirstTable` UInt32) ENGINE = ReplacingMergeTree ORDER BY FirstTable;

INSERT INTO test1 SELECT number % 2 FROM numbers(5);

SELECT * FROM test1;

SET optimize_on_insert = 0;

CREATE TABLE test2 (`SecondTable` UInt32) ENGINE = ReplacingMergeTree ORDER BY SecondTable;

INSERT INTO test2 SELECT number % 2 FROM numbers(5);

SELECT * FROM test2;

결과:

┌─FirstTable─┐
│          0 │
│          1 │
└────────────┘

┌─SecondTable─┐
│           0 │
│           0 │
│           0 │
│           1 │
│           1 │
└─────────────┘

이 설정이 Materialized view 동작에 영향을 준다는 점에 유의하세요.

optimize_prewhere_after_pushdown

이후 쿼리 플랜 최적화가 MergeTree 읽기 단계 위에 추가 필터를 놓은 후(예: JOIN을 통한 조건 프루닝, 프로젝션 재작성) 두 번째 PREWHERE 승격 패스를 실행해요. 기존 PREWHERE가 이미 있으면 새 필터는 별도의 필터 단계로 남는 대신 그것에 AND로 병합돼요.

optimize_qbit_distance_function_reads

QBit 데이터 타입의 거리 함수를, 계산에 필요한 컬럼만 저장소에서 읽는 동등한 함수로 대체해요.

optimize_read_in_order

MergeTree 테이블에서 데이터를 읽기 위한 SELECT 쿼리의 ORDER BY 최적화를 활성화해요. 가능한 값:

  • 0ORDER BY 최적화 비활성화.

  • 1ORDER BY 최적화 활성화.

함께 보기

optimize_read_in_reverse_order_final

ReplacingMergeTree 테이블에서 FINAL 수정자가 있는 SELECT 쿼리의 정렬 키 역순으로 데이터를 읽는 것을 활성화해요. optimize_read_in_order도 활성화된 경우에만 효과가 있어요. 가능한 값:

  • 0FINAL로 역순 읽기 비활성화.

  • 1FINAL로 역순 읽기 활성화.

optimize_respect_aliases

true로 설정하면 WHERE/GROUP BY/ORDER BY에서 별칭을 존중해요. 이는 파티션 프루닝/보조 인덱스/optimize_aggregation_in_order/optimize_read_in_order/optimize_trivial_count에 도움이 돼요.

optimize_sorting_by_input_stream_properties

입력 스트림의 정렬 속성으로 정렬을 최적화해요.

optimize_substitute_columns

컬럼 대체를 위해 constraints를 사용해요. 기본값은 false예요. 가능한 값:

  • true, false.

optimize_syntax_fuse_functions

동일한 인자를 가진 집계 함수를 융합할 수 있게 해줘요. 동일한 인자를 가진 sum, count, avg 중 적어도 두 개의 집계 함수를 포함한 쿼리를 sumCount로 재작성해요. 가능한 값:

  • 0 — 동일한 인자의 함수가 융합되지 않아요.

  • 1 — 동일한 인자의 함수가 융합돼요.

예시 쿼리:

CREATE TABLE fuse_tbl(a Int8, b Int8) Engine = Log;
SET optimize_syntax_fuse_functions = 1;
EXPLAIN SYNTAX run_query_tree_passes = 1 SELECT sum(a), sum(b), count(b), avg(b) from fuse_tbl FORMAT TSVRaw;

결과:

SELECT
    sum(__table1.a) AS `sum(a)`,
    tupleElement(sumCount(__table1.b), 1) AS `sum(b)`,
    tupleElement(sumCount(__table1.b), 2) AS `count(b)`,
    divide(tupleElement(sumCount(__table1.b), 1), toFloat64(tupleElement(sumCount(__table1.b), 2))) AS `avg(b)`
FROM default.fuse_tbl AS __table1

optimize_throw_if_noop

OPTIMIZE 쿼리가 병합을 수행하지 않았을 때 예외를 던지는 것을 활성화 또는 비활성화해요. 기본적으로 OPTIMIZE는 아무것도 하지 않았어도 성공을 반환해요. 이 설정을 사용하면 그러한 상황을 구분하고 예외 메시지에서 그 이유를 얻을 수 있어요. 가능한 값:

  • 1 — 예외 던지기 활성화.

  • 0 — 예외 던지기 비활성화.

optimize_time_filter_with_preimage

DateDateTime 조건을 변환 없이 동등한 비교로 바꿔 최적화해요(예: toYear(col) = 2023col >= '2023-01-01' AND col <= '2023-12-31').

optimize_truncate_order_by_after_group_by_keys

모든 GROUP BY 키가 ORDER BY 접두사에서 다뤄지면 뒤따르는 ORDER BY 요소를 제거해요.

optimize_uniq_to_count

서브쿼리에 distinct 또는 group by 절이 있으면 uniq와 그 변형(uniqUpTo 제외)을 count로 재작성해요.

optimize_using_constraints

쿼리 최적화를 위해 constraints를 사용해요. 기본값은 false예요. 가능한 값:

  • true, false.

더 알아보기 (Learn more)