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.json에 num_defaults 항목을 가져야 하는데, 이는 삽입/병합 시 MergeTree 테이블 설정 nullable_serialization_version이 allow_sparse로 설정된 경우에만 발생해요. 기본값 basic에서는 Nullable 컬럼에 컬럼별 항목이 없으므로 최적화가 조용히 적용되지 않아요.
가능한 값:
-
0— 최적화 비활성화. -
1— 최적화 활성화.
함께 보기:
optimize_trivial_group_by_limit_query
max_rows_to_group_by = n + offset을 group_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_mode를 any가 아닌 값으로 설정했을 때(명시적 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— 최적화 활성화.