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 RUN이 checkDataPart로 결과 병합 파트를 검증해요. 검사가 실패하면 예외가 발생해요.
optimize_empty_string_comparisons
col = ''나 '' = col 같은 표현식을 empty(col)로, col != ''나 '' != col을 notEmpty(col)로 변환해요.
col이 String 또는 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
일부 함수를 서브컬럼 읽기로 변환하여 최적화를 활성화 또는 비활성화해요. 읽는 데이터 양을 줄여요. 변환될 수 있는 함수:
-
mapContainsKeyLike → keys 서브컬럼 읽기.
-
mapContainsValueLike → values 서브컬럼 읽기.
가능한 값:
-
0— 최적화 비활성화. -
1— 최적화 활성화.
optimize_inverse_dictionary_lookup
미리 계산된 가능한 키 값 집합에 대한 더 빠른 조회로 반복적인 역 사전 조회를 피해요.
optimize_multiif_to_if
조건이 하나만 있는 multiIf를 if로 대체해요.
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 최적화를 활성화해요. 가능한 값:
-
0—ORDER BY최적화 비활성화. -
1—ORDER BY최적화 활성화.
함께 보기
optimize_read_in_reverse_order_final
ReplacingMergeTree 테이블에서 FINAL 수정자가 있는 SELECT 쿼리의 정렬 키 역순으로 데이터를 읽는 것을 활성화해요. optimize_read_in_order도 활성화된 경우에만 효과가 있어요.
가능한 값:
-
0—FINAL로 역순 읽기 비활성화. -
1—FINAL로 역순 읽기 활성화.
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
Date와 DateTime 조건을 변환 없이 동등한 비교로 바꿔 최적화해요(예: toYear(col) = 2023 → col >= '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.