optimize_trivial_* 세션 설정

optimize_trivial_* 세션 설정

이 페이지에서는 사소한(trivial) 쿼리를 최적화하는 optimize_trivial_* 세션 설정들을 다뤄요. SELECT count() FROM table, GROUP BY ... LIMIT n, INSERT INTO ... SELECT 같은 단순 쿼리의 최적화를 제어해요. 이 설정들은 system.settings 테이블에서 확인할 수 있으며 ClickHouse 소스에서 자동 생성돼요.

출처: 문서

본문

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

optimize_trivial_approximate_count_query

그런 추정을 지원하는 저장소(예: EmbeddedRocksDB)의 사소한 count 최적화에 근사 값을 사용해요. 가능한 값:

  • 0 — 최적화 비활성화.

  • 1 — 최적화 활성화.

optimize_trivial_count_query

MergeTree의 메타데이터를 사용해 SELECT count() FROM table 사소한 쿼리를 최적화하는 것을 활성화 또는 비활성화해요. 행 수준 보안을 사용해야 한다면 이 설정을 비활성화해요. 가능한 값:

  • 0 — 최적화 비활성화.

  • 1 — 최적화 활성화.

함께 보기:

optimize_trivial_count_with_sparsity_filter

optimize_trivial_count_query 최적화를, <op> const가 정확히 행을 col의 기본값과 비기본값으로 나누는 SELECT count() FROM t WHERE col <op> const 형태의 쿼리로 확장해요. 그런 경우 count는 데이터 스캔 없이 MergeTree가 serialization.json에 이미 유지하는 컬럼별 num_defaults/num_rows 카운터에서 서비스돼요. 인식되는 패턴:

  • Int*/UInt*, String/FixedString, Date/DateTime/DateTime64, Decimal*, UUID, IPv4/IPv6에 대해 col = default(col) / col != default(col).

  • Nullable 컬럼의 IS NULL / IS NOT NULL.

  • String 컬럼의 empty(col) / notEmpty(col).

  • Bool 컬럼의 col = true / col != true.

  • 부호 없는 정수 컬럼의 col > 0, col >= 1, col < 1, col <= 0.

  • Int*, UInt*, Bool 컬럼의 col만 / NOT col(참값 테스트).

등호 패턴은 Float*, Enum*, Nullable, LowCardinality 또는 복합 타입(Tuple, Array, Map, ...)에는 적용되지 않아요 — 그러한 경우 count는 일반 스캔 경로에서 서비스돼요. 효과가 있으려면 파트별 num_defaults 카운터가 정확해야 해요. 대상 테이블에 삽입과 병합 전에 MergeTree 테이블 설정 compute_exact_num_defaults_for_sparse_columns을 활성화해요. 그것 없이 작성된 파츠는 재작성에서 조용히 제외되므로, optimize_trivial_count_with_sparsity_filter만 활성화하는 것으로는 충분하지 않아요. Nullable 컬럼의 IS NULL/IS NOT NULL 패턴의 경우, 컬럼이 serialization.jsonnum_defaults 항목을 가져야 하는데, 이는 삽입/병합 시 MergeTree 테이블 설정 nullable_serialization_versionallow_sparse로 설정된 경우에만 발생해요. 기본값 basic에서는 Nullable 컬럼에 컬럼별 항목이 없으므로 최적화가 조용히 적용되지 않아요. 가능한 값:

  • 0 — 최적화 비활성화.

  • 1 — 최적화 활성화.

함께 보기:

optimize_trivial_group_by_limit_query

max_rows_to_group_by = n + offsetgroup_by_overflow_mode = 'any'와 함께 설정하여 SELECT key_expr FROM table GROUP BY key_expr LIMIT n 사소한 쿼리(투영에 집계 함수, 창 함수, arrayJoin이 없고, HAVING/ORDER BY/QUALIFY/LIMIT BY/DISTINCT/window 절이 없고, GROUP BY 수정자가 없는)의 최적화를 활성화 또는 비활성화해요. n + offset개의 서로 다른 키가 생성되면 집계가 멈춰요. 사용자가 명시적으로 group_by_overflow_modeany가 아닌 값으로 설정했을 때(명시적 throw/break 계약 보존)와, 사용자가 이미 더 타이트한 max_rows_to_group_by를 설정했을 때(최적화가 무효할 때) 최적화는 억제돼요. 가능한 값:

  • 0 — 최적화 비활성화.

  • 1 — 최적화 활성화.

optimize_trivial_insert_select

INSERT INTO table SELECT … FROM TABLES 사소한 쿼리를 최적화해요.

optimize_trivial_view_pushdown_to_distributed

활성화하면 Distributed 테이블 위의 뷰 중 SELECT 목록이 컬럼 참조, *, 또는 표현식만 포함하고(창 함수나 스칼라 서브쿼리 없음) 집계, 그룹화, 정렬, 조인이 없는 경우, 전체 외부 쿼리가 각 샤드로 푸시돼요. 이를 통해 샤드가 뷰의 필터와 표현식을 로컬로 적용할 수 있어 네트워크로 전송되는 데이터 양이 줄어요. 가능한 값:

  • 0 — 최적화 비활성화; Distributed 테이블 위의 뷰는 항상 코디네이터에서 실행돼요.

  • 1 — 최적화 활성화.

더 알아보기 (Learn more)