이 설정은 system.settings에서 확인할 수 있으며 소스 코드로부터 자동 생성됩니다.
optimize_aggregators_of_group_by_keys
SELECT 절에서 GROUP BY 키의 min/max/any/anyLast 집계 함수를 제거합니다
optimize_append_index
인덱스 조건을 추가하려면 제약 조건을 사용합니다. 기본값은 false입니다.
가능한 값:
- true, false
optimize_arithmetic_operations_in_aggregate_functions
산술 연산을 집계 함수 외부로 이동합니다
optimize_const_name_size
버전 이력
| 버전 | 기본값 | 설명 |
|---|---|---|
| 25.11 | 256 | 큰 상수는 스칼라로 대체하고 이름으로 hash를 사용합니다(크기는 이름 길이를 기준으로 추정됨) |
큰 상수는 스칼라로 대체하고 이름으로 hash를 사용합니다(크기는 이름 길이를 기준으로 추정됨).
가능한 값:
- 양의 정수 - 이름의 최대 길이,
- 0 — 항상,
- 음의 정수 - 절대 사용 안 함.
optimize_count_from_files
서로 다른 입력 형식의 파일에서 행 수를 계산하는 최적화 기능을 활성화하거나 비활성화합니다. 이 설정은 테이블 함수/엔진 file/s3/url/hdfs/azureBlobStorage에 적용됩니다.
가능한 값:
- 0 — 최적화가 비활성화됩니다.
- 1 — 최적화가 활성화됩니다.
optimize_dictget_tuple_element
버전 이력
| 버전 | 기본값 | 설명 |
|---|---|---|
| 26.5 | 1 | 불필요한 딕셔너리 속성 조회를 피하기 위해 tupleElement(dictGet(..., tuple_of_attrs, ...), N)을 단일 속성 dictGet 호출로 재작성합니다. |
불필요한 딕셔너리 속성 조회를 피하기 위해 tupleElement(dictGet('dict', ('a', 'b', 'c'), key), 2)를 dictGet('dict', 'b', key)로 재작성합니다. 위치 기반(.1, .2, …) 및 이름 기반(.b) 접근을 지원하며, 기본값 인수가 상수 Tuple 또는 상수들로 이루어진 tuple(...)인 경우에는 dictGetOrDefault에도 적용됩니다.
optimize_distinct_in_order
DISTINCT에 포함된 일부 컬럼이 정렬의 접두사를 이루는 경우 DISTINCT 최적화를 활성화합니다. 예를 들어 MergeTree의 정렬 키(sorting key) 접두사나 ORDER BY 문의 접두사가 이에 해당합니다.
optimize_distributed_group_by_sharding_key
비용이 많이 드는 시작 서버(initiator server)에서의 집계를 피하여 GROUP BY sharding_key 쿼리를 최적화합니다(이에 따라 시작 서버에서 해당 쿼리의 메모리 사용량이 줄어듭니다).
다음 유형의 쿼리가 지원됩니다(및 이들의 모든 조합):
SELECT DISTINCT [..., ]sharding_key[, ...] FROM distSELECT ... FROM dist GROUP BY sharding_key[, ...]SELECT ... FROM dist GROUP BY sharding_key[, ...] ORDER BY xSELECT ... FROM dist GROUP BY sharding_key[, ...] LIMIT 1SELECT ... FROM dist GROUP BY sharding_key[, ...] LIMIT 1 BY x
다음 유형의 쿼리는 지원되지 않습니다(이 중 일부는 나중에 지원될 수 있습니다):
SELECT ... GROUP BY sharding_key[, ...] WITH TOTALSSELECT ... GROUP BY sharding_key[, ...] WITH ROLLUPSELECT ... GROUP BY sharding_key[, ...] WITH CUBESELECT ... GROUP BY sharding_key[, ...] SETTINGS extremes=1
가능한 값:
- 0 — 비활성화됨.
- 1 — 활성화됨.
관련 항목:
optimize_dry_run_check_part
버전 이력
| 버전 | 기본값 | 설명 |
|---|---|---|
| 26.2 | 1 | 새로운 설정 |
활성화하면 OPTIMIZE ... DRY RUN이 checkDataPart를 사용해 최종적으로 병합된 파트를 검증합니다. 검증에 실패하면 예외가 발생합니다.
optimize_empty_string_comparisons
버전 이력
| 버전 | 기본값 | 설명 |
|---|---|---|
| 25.10 | 1 | 새 설정입니다. |
col = '' 또는 '' = col과 같은 표현식은 empty(col)로, col != '' 또는 '' != col과 같은 표현식은 notEmpty(col)로 변환합니다.
이는 col이 String 또는 FixedString 타입인 경우에만 적용됩니다.
optimize_extract_common_expressions
버전 이력
| 버전 | 기본값 | 설명 |
|---|---|---|
| 25.1 | 1 | WHERE, PREWHERE, ON, HAVING 및 QUALIFY 표현식에서 AND 식들의 OR 결합으로부터 공통 표현식을 추출해 최적화합니다. |
| 24.12 | 0 | WHERE, PREWHERE, ON, HAVING 및 QUALIFY 표현식에서 AND 식들의 OR 결합으로부터 공통 표현식을 추출해 최적화하는 설정을 도입합니다. |
WHERE, PREWHERE, ON, HAVING 및 QUALIFY 표현식의 OR 결합에서 공통 표현식을 추출할 수 있도록 허용합니다. (A AND B) OR (A AND C)와 같은 논리 표현식은 A AND (B OR C)로 재작성될 수 있으며, 이는 다음 최적화에 도움이 될 수 있습니다.
- 단순한 필터링 표현식에서 인덱스 활용
- cross를 inner join으로 최적화
optimize_functions_to_subcolumns
버전 이력
| 버전 | 기본값 | 설명 |
|---|---|---|
| 24.8 | 1 | 기본적으로 활성화되는 설정 |
일부 함수를 서브컬럼을 읽는 방식으로 변환하는 최적화를 활성화하거나 비활성화합니다. 이로써 읽어야 하는 데이터 양을 줄일 수 있습니다.
다음 함수는 변환할 수 있습니다:
- length를 size0 서브컬럼을 읽도록 변환합니다.
- empty를 size0 서브컬럼을 읽도록 변환합니다.
- notEmpty를 size0 서브컬럼을 읽도록 변환합니다.
- isNull을 null 서브컬럼을 읽도록 변환합니다.
- isNotNull을 null 서브컬럼을 읽도록 변환합니다.
- count를 null 서브컬럼을 읽도록 변환합니다.
- mapKeys를 keys 서브컬럼을 읽도록 변환합니다.
- mapValues를 values 서브컬럼을 읽도록 변환합니다.
Possible values:
- 0 — 최적화가 비활성화됩니다.
- 1 — 최적화가 활성화됩니다.
optimize_inverse_dictionary_lookup
버전 이력
| 버전 | 기본값 | 설명 |
|---|---|---|
| 25.12 | 1 | 새로운 설정 |
미리 계산된 가능한 키 값 집합을 더 빠르게 조회해 반복적인 역방향 딕셔너리 조회를 피합니다.
optimize_multiif_to_if
조건이 하나뿐인 multiIf를 if로 대체합니다.
optimize_normalize_count_variants
버전 이력
| 버전 | 기본값 | 설명 |
|---|---|---|
| 21.3 | 1 | 기본적으로 count()와 의미상 동일한 집계 함수를 count()로 재작성 |
기본적으로 count()와 의미상 동일한 집계 함수를 count()로 재작성합니다.
optimize_on_insert
버전 이력
| 버전 | 기본값 | 설명 |
|---|---|---|
| 21.1 | 1 | 더 나은 사용자 경험을 위해 기본적으로 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
버전 이력
| 버전 | 기본값 | 설명 |
|---|---|---|
| 26.6 | 0 | 후속 최적화(예: `JOIN`을 통한 프레디케이트 pushdown, projection 재작성)로 `MergeTree` 읽기 단계 위에 추가된 필터를 기존 `PREWHERE` 체인에 병합할 수 있도록, 두 번째 `PREWHERE` 승격 패스를 활성화하는 새로운 설정입니다. |
후속 쿼리 계획 최적화로 MergeTree 읽기 단계 위에 추가 필터가 배치될 수 있는 경우(예: JOIN을 통한 프레디케이트 pushdown, projection 재작성), 그 이후 두 번째 PREWHERE 승격 패스를 실행합니다. 기존 PREWHERE가 이미 있으면 새 필터는 별도의 필터 단계로 남지 않고 여기에 AND로 병합됩니다.
optimize_qbit_distance_function_reads
버전 이력
| 버전 | 기본값 | 설명 |
|---|---|---|
| 25.10 | 1 | 새로운 설정 |
QBit 데이터 타입의 거리 함수를 저장소에서 계산에 필요한 컬럼만 읽는 동등한 함수로 대체합니다.
optimize_read_in_order
MergeTree 테이블에서 데이터를 읽을 때 SELECT 쿼리의 ORDER BY 최적화를 활성화합니다.
가능한 값:
- 0 —
ORDER BY최적화가 비활성화됩니다. - 1 —
ORDER BY최적화가 활성화됩니다.
관련 항목
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
컬럼 치환에 제약 조건를 사용합니다. 기본값은 false입니다.
가능한 값:
- true, false
optimize_syntax_fuse_functions
버전 이력
| 버전 | 기본값 | 설명 |
|---|---|---|
| 26.3 | 1 | 이 최적화는 프로덕션 환경에서 사용할 수 있습니다 |
동일한 인수를 사용하는 집계 함수를 결합할 수 있도록 합니다. 동일한 인수를 사용하는 sum, count 또는 avg 집계 함수가 2개 이상 포함된 쿼리를 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 __table1optimize_throw_if_noop
OPTIMIZE 쿼리가 머지를 수행하지 않았을 때 예외를 발생시킬지 여부를 설정합니다.
기본적으로 OPTIMIZE는 아무 작업도 수행하지 않았더라도 성공으로 처리됩니다. 이 설정을 사용하면 이러한 상황을 구분하고 예외 메시지에서 그 이유를 확인할 수 있습니다.
가능한 값:
- 1 — 예외 발생이 활성화됩니다.
- 0 — 예외 발생이 비활성화됩니다.
optimize_time_filter_with_preimage
버전 이력
| 버전 | 기본값 | 설명 |
|---|---|---|
| 24.2 | 1 | 함수를 변환이 필요 없는 동등한 비교식으로 변환하여 Date 및 DateTime 프레디케이트를 최적화합니다(예: toYear(col) = 2023 -> col >= '2023-01-01' AND col <= '2023-12-31') |
함수를 변환이 필요 없는 동등한 비교식으로 변환하여 Date 및 DateTime 프레디케이트를 최적화합니다(예: toYear(col) = 2023 -> col >= '2023-01-01' AND col <= '2023-12-31')
optimize_truncate_order_by_after_group_by_keys
버전 이력
| 버전 | 기본값 | 설명 |
|---|---|---|
| 26.4 | 1 | 모든 GROUP BY 키가 ORDER BY 접두사에 포함되면 끝부분의 ORDER BY 원소를 제거합니다. |
모든 GROUP BY 키가 ORDER BY 접두사에 포함되면 끝부분의 ORDER BY 원소를 제거합니다.
optimize_uniq_to_count
하위 쿼리에 DISTINCT 또는 GROUP BY 절이 있으면 uniq 및 그 변형(uniqUpTo 제외)을 count로 재작성합니다.
optimize_using_constraints
쿼리 최적화를 위해 제약 조건을 사용합니다. 기본값은 false입니다.
가능한 값:
- true, false