기타 세션 설정
기타 세션 설정 (Other)
이 페이지에서는 system.settings 테이블에서 확인할 수 있으며 ClickHouse 소스 코드에서 자동 생성되는 다양한 "기타" 세션 설정들을 다뤄요. 쿼리 구성, 결과 처리, 오버플로 모드, 코덱, 시계열, 워크로드 스케줄링 등 ClickHouse의 여러 동작을 세부 조정할 수 있어요.
출처: 문서
본문
이 설정들은 system.settings에서 확인할 수 있으며 소스에서 자동 생성돼요.
adaptive_aggregator_freeze_threshold
적응형 집계기가 스레드의 로컬 해시 테이블을 동결시키는 키 수예요(enable_adaptive_aggregator 참고). 값이 작을수록 동결된 테이블이 캐시에 상주하고, 값이 클수록 더 많은 잦은 키를 흡수할 수 있어요. 0은 첫 기회에 테이블을 동결시키는데, 이는 알고리즘이 키 해시에 의한 순수 샤딩처럼 동작하게 해요: 모든 키는 해시로 라우팅되어 단일 소유자가 집계하며, 스캔 중 스레드 간 교환 대신 병합 단계로 지연돼요.
adaptive_aggregator_freeze_threshold_bytes
적응형 집계기가 스레드의 로컬 해시 테이블을 동결시키는 메모리 크기예요(enable_adaptive_aggregator 참고). 테이블은 이 값과 adaptive_aggregator_freeze_threshold 중 먼저 도달하는 쪽에서 동결돼요. 크기는 로컬 테이블 자신의 할당 바이트(해시 테이블 버퍼 + arenas)이며, 블록 사이에 확인돼요. 바이트 경계는 키나 집계 상태가 넓을 때 중요해요: 키 수 임계값만으로는 그러한 테이블이 CPU 캐시를 넘어 성장하게 할 수 있어요. 기본값에서는 일반적인 키·상태 폭의 테이블이 키 수로 계속 동결돼요. 0은 바이트 경계를 비활성화하여 키 수 임계값만으로 결정해요.
add_http_cors_header
add http CORS 헤더를 작성해요.
analyze_index_with_space_filling_curves
테이블의 인덱스에 공간 채움 곡선이 있고(예: ORDER BY mortonEncode(x, y) 또는 ORDER BY hilbertEncode(x, y)), 쿼리에 그 인자에 대한 조건이 있으면(예: x >= 10 AND x <= 20 AND y >= 20 AND y <= 30) 인덱스 분석에 공간 채움 곡선을 사용해요. 현재 2D 분석은 곡선 구현이 인자당 32비트만 사용하므로 UInt64 인자가 있는 곡선을 건너뛰어요.
analyzer_inline_views
활성화하면 분석기가 일반(비-materialized, 비-parametrized) 뷰를 그 정의 서브쿼리로 대체하여, 조건 프루닝과 컬럼 제거 같은 경계 간 최적화를 가능하게 해요.
any_join_distinct_right_table_keys
ANY INNER|LEFT JOIN 연산에서 기존 ClickHouse 서버 동작을 활성화해요.
레거시 JOIN 동작에 의존하는 사용 사례가 있을 때만 하위 호환을 위해 이 설정을 사용해요.
레거시 동작이 활성화되면:
-
t1 ANY LEFT JOIN t2와t2 ANY RIGHT JOIN t1연산의 결과가 같지 않아요. ClickHouse가 다대일(many-to-one) 왼쪽-오른쪽 테이블 키 매핑 로직을 사용하기 때문이에요. -
ANY INNER JOIN연산의 결과가SEMI LEFT JOIN처럼 왼쪽 테이블의 모든 행을 포함해요.
레거시 동작이 비활성화되면:
-
t1 ANY LEFT JOIN t2와t2 ANY RIGHT JOIN t1연산의 결과가 같아요. ClickHouse가ANY RIGHT JOIN연산에서 일대다(one-to-many) 키 매핑을 제공하는 로직을 사용하기 때문이에요. -
ANY INNER JOIN연산의 결과가 왼쪽과 오른쪽 테이블 모두에서 키당 하나의 행을 포함해요.
가능한 값:
-
0— 레거시 동작 비활성화. -
1— 레거시 동작 활성화.
함께 보기:
archive_adaptive_buffer_max_size_bytes
아카이브 파일(예: tar 아카이브)에 쓸 때 사용되는 적응형 버퍼의 최대 크기를 제한해요.
arrow_flight_request_descriptor_type
Arrow Flight 요청에 사용할 디스크립터 유형이에요. path는 데이터셋 이름을 path 디스크립터로 보내요. command는 SQL 쿼리를 command 디스크립터로 보내요(Dremio에 필요).
가능한 값:
-
path—FlightDescriptor::Path사용(기본값, 대부분의 Arrow Flight 서버에서 동작). -
command—SELECT쿼리로FlightDescriptor::Command사용(Dremio에 필요).
backup_slow_all_threads_after_retryable_s3_error
true로 설정하면 같은 백업 엔드포인트에 S3 요청을 실행하는 모든 스레드가, 단일 S3 요청이 'Slow Down' 같은 재시도 가능한 S3 오류를 만난 후 느려져요.
false로 설정하면 각 스레드가 다른 스레드와 독립적으로 s3 요청 백오프를 처리해요.
cache_warmer_threads
ClickHouse Cloud에서만 효과가 있어요. cache_populated_by_fetch가 활성화되었을 때 새 데이터 파트를 파일시스템 캐시로 추측적으로 다운로드하는 백그라운드 스레드 수예요. 0이면 비활성화해요.
calculate_text_stack_trace
쿼리 실행 중 예외 발생 시 텍스트 스택 트레이스를 계산해요. 기본값이에요. 엄청난 양의 잘못된 쿼리가 실행될 때 퍼징 테스트를 느리게 할 수 있는 심볼 조회가 필요해요. 일반적인 경우 이 옵션을 비활성화하면 안 돼요.
cancel_http_readonly_queries_on_client_close
클라이언트가 응답을 기다리지 않고 연결을 닫으면 HTTP 읽기 전용 쿼리(예: SELECT)를 취소해요.
Cloud 기본값: 1.
cascades_aggregation_pushdown
부분 집계를 조인 아래로 푸시(eager aggregation)하는 것을 Cascades 최적화기의 비용 기반 대안으로 고려해요.
enable_cascades_optimizer = 1과 make_distributed_plan = 1을 함께 사용할 때만 효과가 있어요.
checksum_on_read
읽기 시 체크섬을 검증해요. 기본적으로 활성화되어 있으며 프로덕션에서 항상 활성화해야 해요. 이 설정을 비활성화해도 이점을 기대하지 마세요. 실험과 벤치마크에만 사용할 수 있어요. 이 설정은 MergeTree 계열 테이블에만 적용돼요. 다른 테이블 엔진과 네트워크를 통한 데이터 수신에는 체크섬이 항상 검증돼요.
compression
응답 본문에 일반 압축을 적용해요(예: compression=gz). 이것은 Content-Encoding(HTTP 압축) 및 레거시 compress 매개변수(ClickHouse 네이티브 압축)와는 독립적이라는 점에 유의하세요. URL 경로에 압축 파일 확장자를 지정하는 것과 동일해요.
이것은 HTTP 인터페이스 응답 형성 설정이에요: 쿼리가 실행되기 전에 소비되므로(응답 버퍼가 미리 설정됨) HTTP URL 매개변수, URL 경로 파일 확장자, 또는 사용자 프로필로 제공해야 하며, 쿼리 내 SETTINGS 절로는 제공할 수 없어요(그 경우 효과가 없고 거부돼요).
connection_pool_max_wait_ms
연결 풀이 가득 찼을 때 연결을 기다리는 시간(밀리초)이에요.
레플리카마다 연결 풀이 하나이므로 대기는 레플리카별로 적용돼요. 만료되면 시도가 NO_FREE_CONNECTION으로 실패해요. 분산 SELECT가 사용하는 페일오버 경로에서는 이것이 다른 사용 불가 레플리카처럼 취급돼요: 쿼리는 나머지 레플리카를 시도하고, 모두 시도된 후에만 ALL_CONNECTION_TRIES_FAILED로 실패해요. 따라서 이 설정은 전체 쿼리를 제한하지 않아요. N개 레플리카와 각각 T번 시도하면 총 대기는 connection_pool_max_wait_ms × N × T에 도달할 수 있어요. 여기서 T는 connections_with_failover_max_tries이지만 레플리카는 작성되기 전에 항상 한 번 시도되므로 최소 1 이상이에요. 쿼리 자체를 제한하려면 max_execution_time을 사용해요.
skip_unavailable_shards는 이것을 조용히 처리하지 않아요: 이니시에이터가 여유 연결 슬롯이 없었던 레플리카는 결코 접촉하지 않았으므로 샤드가 사용 불가로 취급되지 않아요.
가능한 값:
-
양의 정수.
-
0— 무한 시간 초과. 대기는 여전히KILL QUERY와 기본 timeout_overflow_mode의throw에서max_execution_time에 의해 중단돼요.break에서는 시간 제한이 쿼리를 취소하지 않으므로 연결이 해제될 때까지 대기가 계속돼요.KILL QUERY는 여전히 중단시켜요.
connections_with_failover_max_tries
Distributed 테이블 엔진에서 각 레플리카에 대한 최대 연결 시도 횟수예요.
convert_query_to_cnf
true로 설정하면 SELECT 쿼리가 논리합 정규형(CNF)으로 변환돼요. 쿼리를 CNF로 재작성하면 더 빠르게 실행될 수 있는 시나리오가 있어요(설명은 이 Github issue를 참고).
예를 들어, 다음 SELECT 쿼리가 수정되지 않는 것(기본 동작)을 살펴봐요:
EXPLAIN SYNTAX
SELECT *
FROM
(
SELECT number AS x
FROM numbers(20)
) AS a
WHERE ((x >= 1) AND (x <= 5)) OR ((x >= 10) AND (x <= 15))
SETTINGS convert_query_to_cnf = false;
결과는:
┌─explain────────────────────────────────────────────────────────┐
│ SELECT x │
│ FROM │
│ ( │
│ SELECT number AS x │
│ FROM numbers(20) │
│ WHERE ((x >= 1) AND (x <= 5)) OR ((x >= 10) AND (x <= 15)) │
│ ) AS a │
│ WHERE ((x >= 1) AND (x <= 5)) OR ((x >= 10) AND (x <= 15)) │
│ SETTINGS convert_query_to_cnf = 0 │
└────────────────────────────────────────────────────────────────┘
convert_query_to_cnf를 true로 설정하고 무엇이 바뀌는지 봐요:
EXPLAIN SYNTAX
SELECT *
FROM
(
SELECT number AS x
FROM numbers(20)
) AS a
WHERE ((x >= 1) AND (x <= 5)) OR ((x >= 10) AND (x <= 15))
SETTINGS convert_query_to_cnf = true;
WHERE 절이 CNF로 재작성되지만 결과 집합은 동일해요 — 불리언 로직은 변경되지 않았어요:
┌─explain───────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ SELECT x │
│ FROM │
│ ( │
│ SELECT number AS x │
│ FROM numbers(20) │
│ WHERE ((x <= 15) OR (x <= 5)) AND ((x <= 15) OR (x >= 1)) AND ((x >= 10) OR (x <= 5)) AND ((x >= 10) OR (x >= 1)) │
│ ) AS a │
│ WHERE ((x >= 10) OR (x >= 1)) AND ((x >= 10) OR (x <= 5)) AND ((x <= 15) OR (x >= 1)) AND ((x <= 15) OR (x <= 5)) │
│ SETTINGS convert_query_to_cnf = 1 │
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
가능한 값: true, false.
count_matches_stop_at_empty_match
countMatches 함수에서 패턴이 길이 0과 일치하면 카운트를 멈춰요.
cross_to_inner_join_rewrite
WHERE 섹션에 조인 표현식이 있으면 쉼표/cross 조인 대신 내부 조인을 사용해요. 값: 0 - 재작성 안 함, 1 - 가능하면 comma/cross에 적용, 2 - 모든 comma 조인 강제 재작성, cross - 가능하면.
data_type_default_nullable
컬럼 정의에 명시적 수정자 NULL or NOT NULL이 없는 데이터 타입을 Nullable로 만들 수 있게 해요. 가능한 값:
-
1— 컬럼 정의의 데이터 타입이 기본적으로Nullable로 설정돼요. -
0— 컬럼 정의의 데이터 타입이 기본적으로 not Nullable로 설정돼요.
decimal_check_overflow
decimal 산술/비교 연산의 오버플로를 확인해요.
deduplicate_blocks_in_dependent_materialized_views
Replicated* 테이블에서 데이터를 받는 머티리얼라이즈드 뷰에 대한 중복 제거 확인을 활성화 또는 비활성화해요.
가능한 값:
-
0— 비활성화. -
1— 활성화.
활성화하면 ClickHouse가 Replicated* 테이블에 의존하는 머티리얼라이즈드 뷰에서 블록 중복 제거를 수행해요.
이 설정은 삽입 작업이 실패로 인해 재시도될 때 머티리얼라이즈드 뷰에 중복 데이터가 포함되지 않도록 보장하는 데 유용해요.
함께 보기
defer_partition_pruning_after_final
활성화되면(기본값) 파티션 키 컬럼이 정렬 키의 일부가 아닌 테이블의 FINAL 쿼리에 대해 파티션 프루닝이 건너뛰어져요. 이것은 26.3에서 도입된 정확성-안전 동작이에요: FINAL은 기본 키를 공유하지만 서로 다른 파티션에 있는 행을 중복 제거해야 할 수 있는데, 파티션 프루닝은 그런 행을 중복 제거 입력에서 조용히 제외할 수 있어요.
비활성화하면 FINAL에서도 파티션 프루닝이 적용되어 26.3 이전 동작을 복원해요. 파티션 컬럼에 WHERE 조건이 있는 쿼리에서는 상당히 빨라질 수 있지만, 같은 기본 키를 가진 행이 서로 다른 파티션에 존재할 수 없을 때만 정확해요 — 예: 파티션 컬럼이 삽입 시 설정되고 결코 변하지 않는 이벤트 로그 테이블.
이 설정은 파티션 키 컬럼이 정렬 키에 포함되지 않은 파티션 테이블에만 영향을 주며, 다른 테이블에는 파티션 프루닝이 항상 적용돼요.
가능한 값:
-
0—FINAL전에 파티션 프루닝 적용(26.3 이전 동작, 빠르지만 일반적으로 안전하지 않음). -
1— 파티션 프루닝을FINAL이후로 지연(기본값, 정확성-안전).
describe_compact_output
true이면 DESCRIBE 쿼리 결과에 컬럼 이름과 타입만 포함해요.
dialect
쿼리를 파싱하는 데 사용할 방언이에요. 지원되는 값:
-
clickhouse(기본값) — 표준 ClickHouse SQL. -
kusto— Kusto Query Language. 실험적 설정allow_experimental_kusto_dialect필요. -
prql— PRQL. 실험적 설정allow_experimental_prql_dialect필요. -
polyglot— 다른 방언(MySQL, PostgreSQL 등)의 SQL을 ClickHouse SQL로 트랜스파일해요. 실험적 설정allow_experimental_polyglot_dialect필요. -
promql— TimeSeries 테이블에 걸쳐 평가되는 PromQL(Prometheus Query Language)로,promql_database,promql_table,promql_evaluation_time설정으로 구성돼요. -
clickhouse_json— SQL 텍스트 대신 쿼리가 JSON AST(parseQueryToJSON의 출력)로 해석돼요.SET쿼리는 방언을 다시 전환할 수 있도록 일반 형태로 여전히 인식돼요. 실험적 설정enable_json_ast_dialect필요. -
trino— Trino SQL: Trino 구문(ARRAY[...],TRY_CAST,UNNEST, ...)을 번역하고 Trino 함수 이름을 ClickHouse 동등 함수에 매핑해요. 실험적 설정enable_trino_dialect필요.
discard_query_data
활성화하면 서버가 쿼리 결과 행을 클라이언트로 보내는 것을 건너뛰어요. 쿼리는 여전히 서버에서 완전히 실행되고 기록되며, 클라이언트는 나머지 패킷을 여전히 받아요. 섀도우 트래픽, 벤치마크, 퍼징에 사용돼요. 보조 쿼리에는 효과가 없어요. 네이티브 TCP 프로토콜에만 영향을 줘요.
distinct_overflow_mode
데이터 양이 제한 중 하나를 초과할 때 어떻게 할지 설정해요. 가능한 값:
-
throw: 예외를 던져요(기본값). -
break: 쿼리 실행을 중단하고, 소스 데이터가 소진된 것처럼 부분 결과를 반환해요.
do_not_merge_across_partitions_select_final
서로 다른 파티션 간 병합을 피해 FINAL 쿼리를 개선해요.
활성화하면 SELECT FINAL 쿼리 중 서로 다른 파티션의 파츠가 함께 병합되지 않아요. 대신 각 파티션 내에서만 병합이 발생해요. 파티션 테이블 작업 시 쿼리 성능을 크게 개선할 수 있어요.
dynamic_throw_on_type_mismatch
Dynamic 컬럼에 기본 구현으로 함수를 적용할 때, 실제 타입이 함수와 호환되지 않는 행에 대해 어떻게 할지 제어해요:
-
true(기본값) — 예외를 던져요. -
false— 그런 행에 대해NULL을 반환해요.
enforce_strict_identifier_format
활성화하면 영숫자와 밑줄만 포함한 식별자만 허용해요.
engine_url_skip_empty_files
URL 엔진 테이블에서 빈 파일을 건너뛰는 것을 활성화 또는 비활성화해요. 가능한 값:
-
0— 빈 파일이 요청된 형식과 호환되지 않으면SELECT가 예외를 던져요. -
1—SELECT가 빈 파일에 대해 빈 결과를 반환해요.
exact_rows_before_limit
활성화하면 ClickHouse가 rows_before_limit_at_least 통계에 대해 정확한 값을 제공하지만, 그 대가로 limit 앞의 데이터를 완전히 읽어야 해요.
except_default_mode
EXCEPT 쿼리의 기본 모드를 설정해요. 가능한 값: 빈 문자열, ALL, DISTINCT. 비어 있으면 모드 없는 쿼리가 예외를 던져요.
exclude_materialize_skip_indexes_on_insert
지정된 스킵 인덱스를 INSERT 중 빌드·저장에서 제외해요. 제외된 스킵 인덱스는 여전히 병합 중 또는 명시적 MATERIALIZE INDEX 쿼리로 빌드·저장돼요.
materialize_skip_indexes_on_insert가 false이면 효과가 없어요.
예:
CREATE TABLE tab
(
a UInt64,
b UInt64,
INDEX idx_a a TYPE minmax,
INDEX idx_b b TYPE set(3)
)
ENGINE = MergeTree ORDER BY tuple();
SET exclude_materialize_skip_indexes_on_insert='idx_a'; -- idx_a는 삽입 시 갱신되지 않음
--SET exclude_materialize_skip_indexes_on_insert='idx_a, idx_b'; -- 어떤 인덱스도 삽입 시 갱신되지 않음
INSERT INTO tab SELECT number, number / 50 FROM numbers(100); -- idx_b만 갱신됨
-- 세션 설정이므로 쿼리 수준에서 설정할 수 있음
INSERT INTO tab SELECT number, number / 50 FROM numbers(100, 100) SETTINGS exclude_materialize_skip_indexes_on_insert='idx_b';
ALTER TABLE tab MATERIALIZE INDEX idx_a; -- 이 쿼리로 인덱스를 명시적으로 구체화할 수 있음
SET exclude_materialize_skip_indexes_on_insert = DEFAULT; -- 설정을 기본값으로 재설정
execute_exists_as_scalar_subquery
비상관 EXISTS 서브쿼리를 스칼라 서브쿼리로 실행해요. 스칼라 서브쿼리처럼 캐시가 사용되고 결과에 상수 폴딩이 적용돼요.
Cloud 기본값: 0.
explain_query_plan_default
EXPLAIN PLAN이 사용하는 기본 형식이에요.
가능한 값:
-
pretty(26.7부터 기본) —actions,compact,pretty가 기본적으로true가 되어, 컴팩트하고 예쁘며 액션 주석이 달린 플랜을 생성해요. -
legacy— 26.7 이전 출력.
EXPLAIN 문에서 actions, compact, pretty 옵션을 명시적으로 지정하면(예: EXPLAIN actions = 0, compact = 0, pretty = 0 SELECT ...) 항상 이 설정을 덮어써요.
json = 1 또는 distributed = 1이 있는 EXPLAIN PLAN은 actions, compact, pretty가 명시적으로 설정되지 않는 한 이 설정과 무관하게 레거시(26.7 이전) 기본값을 유지해요. pretty 출력은 JSON 결과나 샤드별 분산 플랜을 나타낼 수 없으므로 그 모드들은 레거시 형태로만 올바르게 렌더링돼요.
explain_syntax_single_record
EXPLAIN SYNTAX 출력을 한 줄에 하나의 레코드 대신 단일 레코드(내장 줄바꿈 포함)로 반환하여, 결과가 단일 복구 가능한 행이 되도록 해요(예: SELECT count() FROM (EXPLAIN SYNTAX ...)는 1을 반환).
EXPLAIN SYNTAX 문에서 single_record 옵션을 명시적으로 지정하면(예: EXPLAIN SYNTAX single_record = 0 SELECT ...) 항상 이 설정을 덮어써요.
26.8 이전의 한 줄당 하나의 레코드 출력을 복원하려면 false로 설정하거나, 26.8보다 오래된 버전으로 compatibility를 설정해요.
extract_key_value_pairs_max_pairs_per_row
별칭: extract_kvp_max_pairs_per_row
extractKeyValuePairs 함수가 생성할 수 있는 최대 쌍 수예요. 너무 많은 메모리를 소비하는 것을 방지하는 보호 장치로 사용돼요.
extremes
쿼리 결과 컬럼의 극단값(최솟값과 최댓값)을 셀지 여부예요. 0 또는 1을 받아요. 기본값은 0(비활성화)이에요.
자세한 내용은 "Extreme values" 섹션을 참고하세요.
fallback_to_stale_replicas_for_distributed_queries
업데이트된 데이터를 사용할 수 없으면 오래된 레플리카로 쿼리를 강제로 보내요. Replication 참고.
ClickHouse는 테이블의 오래된 레플리카 중 가장 관련성이 높은 것을 선택해요.
복제 테이블을 가리키는 분산 테이블에서 SELECT를 수행할 때 사용돼요.
기본적으로 1(활성화)이에요.
file_like_engine_default_partition_strategy
파일류 엔진의 기본 파티션 전략이에요. glob이나 {_partition_id} 자리표시자가 없는 경로의 CREATE 쿼리에만 적용돼요. {_partition_id}가 있는 경로는 항상 wildcard를 사용해요. 다른 glob이 있는 경로는 파티션 전략을 사용하지 않고 PARTITION BY를 무시해요. 이 설정이 wildcard지만 경로에 {_partition_id}가 없으면 파티션 전략이 사용되지 않으며, 자신의 엔진 인자에 이 결정을 유지할 수 없는 테이블 엔진(예: HDFS)은 그러한 CREATE를 대신 거부해요.
filesystem_prefetches_limit
최대 프리페치 수예요. 0은 무제한을 의미해요. 프리페치 수를 제한하려면 filesystem_prefetches_max_memory_usage 설정이 더 권장돼요.
filter
쿼리에 래핑 서브쿼리로 WHERE 절을 추가해요. 여러 필터는 AND로 결합돼요. HTTP 인터페이스는 여러 filter URL 매개변수를 허용하며, 그것들은 순서대로 그리고 이 설정의 값과 AND로 결합돼요.
이것은 엔진이 파싱된 쿼리에 적용하는 쿼리 구성 설정이에요(파생 테이블로 래핑). 따라서 기존 쿼리와 결합되고 모든 프로토콜에서 동작해요: HTTP URL 매개변수, 쿼리 내 SETTINGS 절, 또는 사용자 프로필로 제공할 수 있어요.
결과를 만드는 SELECT/UNION 쿼리를 형성해요. 쓰기 쿼리(INSERT … SELECT, CREATE … AS SELECT)의 경우 소스 SELECT가 자신의 SETTINGS 절에 그것을 담을 때만 효과가 있어요. 프로필이나 세션에서 상속된 값, 또는 INSERT/CREATE 문 자체에 설정된 값은 소스 SELECT로 전파되지 않아요 — 다른 설정에 적용되는 것과 같은 비전파 규칙이에요.
filter는 접근 제어 메커니즘이 아니며 행 수준 보안 정책이나 additional_table_filters 설정의 대체물로 사용하면 안 돼요. 그것은 래핑 서브쿼리에 WHERE만 추가하므로, 필터가 적용되기 전에 밑에 있는 데이터가 여전히 읽히고 처리돼요 — 쿼리가 처리 중 필터링된 행을 관찰할 수 있어요(예: throwIf로 오류 경로를 통해 정보를 유출). 사용자가 접근할 수 있는 행을 제한하는 것이 목표라면 행 수준 보안이나 additional_table_filters를 사용해요.
final
쿼리의 모든 테이블에 FINAL 수정자를 자동으로 적용해요. FINAL이 적용 가능한 테이블, 조인된 테이블과 서브쿼리의 테이블, 분산 테이블에 적용해요. 가능한 값:
-
0- 비활성화. -
1- 활성화.
예:
CREATE TABLE test
(
key Int64,
some String
)
ENGINE = ReplacingMergeTree
ORDER BY key;
INSERT INTO test FORMAT Values (1, 'first');
INSERT INTO test FORMAT Values (1, 'second');
SELECT * FROM test;
┌─key─┬─some───┐
│ 1 │ second │
└─────┴────────┘
┌─key─┬─some──┐
│ 1 │ first │
└─────┴───────┘
SELECT * FROM test SETTINGS final = 1;
┌─key─┬─some───┐
│ 1 │ second │
└─────┴────────┘
SET final = 1;
SELECT * FROM test;
┌─key─┬─some───┐
│ 1 │ second │
└─────┴────────┘
finalize_projection_parts_synchronously
활성화하면 프로젝션 파트가 INSERT 중 동기적으로 최종화되어, S3 업로드 병렬성이 줄어드는 대가로 최고 메모리 사용량이 줄어요. 기본적으로 각 프로젝션의 출력 스트림은 전체 파트(모든 프로젝션 포함)가 최종화될 때까지 유지되어 S3 업로드를 겹치게 하지만 프로젝션 수에 비례하여 최고 메모리를 증가시켜요. 이 설정은 INSERT 경로에만 영향을 주며, 병합과 변경은 이미 프로젝션을 동기적으로 최종화해요.
flatten_nested
nested 컬럼의 데이터 형식을 설정해요. 가능한 값:
-
1—Nested컬럼이 별도의 배열로 평평해져요. -
0—Nested컬럼이 튜플의 단일 배열로 유지돼요.
사용법
설정이 0이면 임의 수준의 중첩을 사용할 수 있어요.
예시
쿼리:
SET flatten_nested = 1;
CREATE TABLE t_nest (`n` Nested(a UInt32, b UInt32)) ENGINE = MergeTree ORDER BY tuple();
SHOW CREATE TABLE t_nest;
결과:
┌─statement───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ CREATE TABLE default.t_nest
(
`n.a` Array(UInt32),
`n.b` Array(UInt32)
)
ENGINE = MergeTree
ORDER BY tuple()
SETTINGS index_granularity = 8192 │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
쿼리:
SET flatten_nested = 0;
CREATE TABLE t_nest (`n` Nested(a UInt32, b UInt32)) ENGINE = MergeTree ORDER BY tuple();
SHOW CREATE TABLE t_nest;
결과:
┌─statement──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ CREATE TABLE default.t_nest
(
`n` Nested(a UInt32, b UInt32)
)
ENGINE = MergeTree
ORDER BY tuple()
SETTINGS index_granularity = 8192 │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
format
입력과 출력 모두에 쿼리의 FORMAT을 재정의해요. 쿼리와 파일 확장자에 지정된 형식을 이깁니다. 더 구체적인 input_format과 output_format 설정이 각 방향에 대해 이 일반 형식 설정보다 우선해요.
framing_output_format
쿼리 응답의 서로 다른 부분(데이터·totals·extremes 청크, 진행 패킷, 프로필 이벤트(지표), 서버 로그)을 단일 스트림으로 다중화할 수 있게 해요 — 네이티브 프로토콜이 지원하는 모든 것.
프레이밍 형식은 출력 형식과 독립적이에요: 임의 출력 형식이 생성한 바이트를 분리하고 잠재적으로 인코딩하여 캡슐화해요. 모든 데이터·totals·extremes 패킷 페이로드의 결합은 프레이밍 없이 출력 형식이 생성했을 것과 정확히 같아요. 보조 패킷(진행, 로그, 프로필 이벤트, 예외)은 JSON으로 표현돼요.
한 가지 의도된 예외: plain 출력에서 totals와 extremes를 표현할 수 없어 버리는 출력 형식(JSONCompactEachRow 계열)은 프레이밍 하에서는 그것들을 totals와 extremes 패킷으로 내보내요. 그러한 형식의 경우 데이터 패킷만의 결합이 정확히 프레이밍 없는 출력이며, totals와 extremes 패킷은 프레이밍 없는 출력에 없는 추가 행을 실어 나를 수 있어요.
서버 로그는 send_logs_level 설정이 설정된 경우 포함되고, 프로필 이벤트는 send_profile_events 설정이 활성화된 경우 포함돼요(그것들은 interactive_delay 마이크로초에 최대 한 번 전송되며, 진행 패킷도 interactive_delay로 조절돼요).
성공적 스트림은 최종 카운터(result_rows, result_bytes, memory_usage)를 실은 마지막 진행 패킷으로 끝나는데, 네이티브 프로토콜의 최종 진행 패킷처럼 쿼리 완료 로깅이 내보낸 마지막 로그 및 profile_events 패킷 뒤에 작성돼요. 실패 시 예외 패킷이 마지막 패킷 대신 온다 — 단 한 가지 예외: 응답으로 이미 패킷 스트림의 일부가 생성되고 더 이상 버릴 수 없을 때(패킷 쓰기가 중간에 실패하거나, 예외 패킷 전달 자체가 실패하거나, 응답 스트림이 플러시·닫히는 동안 실패) 프레이밍은 닫힌(fail closed) 상태로 실패해요 — 스트림이 종료 예외 패킷 없이 종료되고, 클라이언트는 파싱 가능한 종료 패킷 대신 잘린 응답과 중단된 HTTP 연결을 관찰해요. 부분 패킷 스트림 뒤에 아무것도 추가되지 않으므로 일반 HTTP 오류 본문이 그것에 섞이지 않아요.
쿼리가 자신의 SETTINGS 절로만 활성화하는 것(프레이밍 형식, send_logs_level, send_profile_events)은 쿼리가 파싱될 때까지 알려지지 않으므로, 해당 로그와 프로필 이벤트는 쿼리 실행부터만 캡처돼요. 파싱·플랜·분석 단계의 로그와 프로필 이벤트는 설정이 세션이나 URL에서 온 경우에만 캡처돼요. 예를 들어 분석 중 실패하는 쿼리(알 수 없는 테이블 참조 등)가 SETTINGS 절에서만 send_logs_level을 활성화하면 분석 단계 로그가 아닌 예외 패킷만 전달돼요. 세션이나 URL에 send_logs_level을 설정해 그 로그들을 캡처해요.
같은 늦은 발견 주의가 send_logs_source_regexp에도 적용돼요: 로그 큐는 각 항목이 캡처될 때 소스별로 필터링하므로, 쿼리 자신의 SETTINGS 절에만 설정된 정규식은 쿼리 실행부터 효과가 있어요. 파싱·플랜·분석 단계의 로그 패킷은 설정의 세션이나 URL 값으로 필터링되므로(거기 설정되지 않으면 비필터링) 쿼리 수준 정규식과 일치하지 않는 소스를 포함할 수 있어요. 반대로 더 좁은 세션이나 URL 정규식이 버린 항목은 더 넓은 쿼리 수준 정규식으로 복구되지 않아요. 전체 쿼리 수명 주기를 필터링하려면 세션이나 URL에 send_logs_source_regexp를 설정해요.
현재 이 설정은 HTTP 프로토콜에 적용되며 다른 인터페이스에서는 무시돼요.
가능한 값:
-
None— 적용 가능한 모든 것(데이터, totals, extremes, 진행)을 투명하게 출력 형식으로 라우팅하고, 적용할 수 없는 것(지표, 로그)은 무시해요. 그래서 모든 것이 기본적으로 동작해요. -
EventStream— 패킷을 HTTP server-sent events(text/event-stream)로 프레이밍해요. 모든 패킷이 대응하는 이름(data,totals,extremes,progress,log,profile_events,exception)의 이벤트로 전송돼요. 진행 및 기타 보조 패킷은 JSON으로 전송돼요. server-sent events는 개행(캐리지 리턴\r포함)을 구분자로 취급하는 텍스트 프로토콜이므로, 형식화된 데이터의 블록은 이벤트의 단일data필드로 base64 인코딩되며, 이는 모든 줄바꿈이 있는 완전히 형식화된 페이로드로 디코딩돼요.Content-Type은 이를 알리기 위해payload=base64매개변수를 실어요. 텍스트와 바이너리 모두 어떤 출력 형식이든 이 방식으로 바이트-정확하게 전달될 수 있어요. -
JSONEachPacketBase64— 모든 패킷이 별도 줄의 JSON 객체이며, 형식화된 데이터는 base64 인코딩돼요(예:{"packet":"data","data":"eyJ4IjoxfQo="}). 바이너리 출력 형식에 적합해요. -
JSONEachPacketString— 모든 패킷이 별도 줄의 JSON 객체이며, 형식화된 데이터는 문자열에 넣어져요(예:{"packet":"data","data":"{\"x\":1}\n"}).
JSONEachPacketString은 페이로드 바이트를 검증하거나 재인코딩 없이 JSON 문자열에 넣어요. String과 FixedString 컬럼은 임의 바이트를 담을 수 있으므로 텍스트 출력 형식(JSONEachRow, TSV, CSV 등)은 그러한 값에 대해 잘못된 UTF-8을 내보낼 수 있어요 — 기본 output_format_json_validate_utf8 = 0으로 ClickHouse 자신의 JSONEachRow가 하는 것처럼 — 그러면 결과 NDJSON 스트림이 유효한 UTF-8임이 보장되지 않아요. 임의 바이트의 바이트-정확 전송에는 JSONEachPacketBase64를 사용해요.
예:
curl "http://localhost:8123/?framing_output_format=JSONEachPacketString" -d "SELECT number FROM numbers(3) FORMAT JSONEachRow"
결과:
{"packet":"data","data":"{\"number\":\"0\"}\n{\"number\":\"1\"}\n{\"number\":\"2\"}\n"}
{"packet":"profile_events","profile_events":[{"host_name":"localhost","current_time":"2026-07-11 00:00:00","thread_id":"0","type":"increment","name":"SelectedRows","value":"3"}]}
{"packet":"progress","progress":{"read_rows":"3","read_bytes":"24","total_rows_to_read":"3","result_rows":"3","result_bytes":"24","elapsed_ns":"1265958"}}
fsync_metadata
.sql 파일을 쓸 때 fsync를 활성화 또는 비활성화해요. 기본적으로 활성화돼요.
서버에 지속적으로 생성·파괴되는 수백만 개의 작은 테이블이 있으면 비활성화하는 것이 합리적이에요.
functions_h3_default_if_invalid
false이면 h3CellAreaM2 같은 h3 함수가 입력이 유효하지 않을 때 예외를 던져요. true이면 0 또는 기본값을 반환해요.
geo_distance_returns_float64_on_float64_arguments
geoDistance, greatCircleDistance, greatCircleAngle 함수의 네 인자가 모두 Float64이면 Float64를 반환하고 내부 계산에 배정밀도를 사용해요. 이전 ClickHouse 버전에서는 함수가 항상 Float32를 반환했어요.
geotoh3_argument_order
함수 geoToH3는 lon_lat으로 설정하면 (lon, lat)을, lat_lon으로 설정하면 (lat, lon)을 받아요.
glob_expansion_max_elements
허용되는 최대 주소 수예요(외부 스토리지, 테이블 함수 등).
h3togeo_lon_lat_result_order
함수 h3ToGeo는 true이면 (lon, lat)을 반환하고, 그렇지 않으면 (lat, lon)을 반환해요.
handshake_timeout_ms
핸드셰이크 중 레플리카로부터 Hello 패킷을 받는 시간 초과(밀리초)예요.
hedged_connection_timeout_ms
Hedged 요청을 위해 레플리카와 연결을 수립하는 연결 시간 초과예요.
highlight_max_matches_per_row
highlight 함수에서 행당 최대 하이라이트 일치 수를 설정해요. 큰 텍스트에서 매우 반복적인 패턴을 하이라이트할 때 과도한 메모리 사용을 방지하는 데 사용해요. 가능한 값:
- 양의 정수.
hnsw_candidate_list_size_for_search
벡터 유사도 인덱스를 검색할 때 동적 후보 목록의 크기로, 'ef_search'라고도 해요.
hsts_max_age
HSTS의 만료 시간이에요. 0은 HSTS 비활성화를 의미해요.
idle_connection_timeout
지정된 초 후 유휴 TCP 연결을 닫는 시간 초과예요. 가능한 값:
- 양의 정수(
0- 0초 후 즉시 닫음).
inject_random_order_for_select_without_order_by
활성화하면 ORDER BY 절이 없는 SELECT 쿼리에 ORDER BY rand()를 주입해요.
서브쿼리 깊이 = 0에만 적용돼요. 서브쿼리와 INSERT INTO … SELECT는 영향받지 않아요.
최상위 구성이 UNION이면 ORDER BY rand()가 모든 자식에 독립적으로 주입돼요.
테스트와 개발에만 유용해요(누락된 ORDER BY는 비결정적 쿼리 결과의 원인).
input_format
쿼리의 입력 형식을 재정의해요. 쿼리에 지정된 형식을 이깁니다.
interactive_delay
요청 실행이 취소되었는지 확인하고 진행 상황을 보내는 간격(마이크로초)이에요.
intersect_default_mode
INTERSECT 쿼리의 기본 모드를 설정해요. 가능한 값: 빈 문자열, ALL, DISTINCT. 비어 있으면 모드 없는 쿼리가 예외를 던져요.
least_greatest_legacy_null_behavior
활성화하면 함수 least와 greatest가 인자 중 하나가 NULL이면 NULL을 반환해요.
legacy_column_name_of_tuple_literal
큰 튜플 리터럴의 모든 요소 이름을 해시 대신 컬럼 이름에 나열해요. 이 설정은 호환성 목적으로만 존재해요. 21.7보다 낮은 버전에서 더 높은 버전으로 클러스터를 롤링 업데이트하는 동안 true로 설정하는 것이 합리적이에요.
legacy_join_size_limits_trigger_spilling
디스크에서 실행되는 조인 부분에 대해, spill 임계값이 트리거가 되기 전의 max_rows_in_join과 max_bytes_in_join 동작을 복원해요: 그 중 하나에 도달하면 쿼리를 중단하는 대신 조인이 더 스필되게 해요.
join_algorithm = 'grace_hash'는 그 두 가지에만 스필하고 max_bytes_before_external_join을 완전히 무시해요(0 포함). hash/parallel_hash는 여전히 spill 임계값에서 디스크로 가고 그 후 둘 중 하나에 스필해요. 메모리 내 단계는 이전처럼 두 가지를 하드 상한으로 계속 취급해요.
이 두 설정의 이전 의미로 작성된 쿼리를 위한 것이며, compatibility가 자동으로 활성화해요.
이 설정보다 오래된 서버는 이전 의미를 적용하며 달리 지시할 수 없으므로, serialize_query_plan = 1이면 새 의미에 의존하는 스필이 있는 조인은 그러한 서버로 전혀 보내지지 않아요: 쿼리가 조용히 다른 계약으로 실행되는 대신 실패해요. 이 설정을 켜면 그러한 쿼리가 두 버전에서 이전 의미로 동작하게 돼요.
limit
쿼리 결과에서 가져올 최대 행 수를 설정해요. LIMIT 절이 설정한 값을 조정해요. 값은 LIMIT로 전달되며, LIMIT가 받아들이는 모든 것(결과 끝에서 세는 음수 값과 결과의 몫으로 해석되는 (0, 1)의 분수 포함)을 받아들여요.
가능한 값:
-
0— 행 수가 제한되지 않아요. -
양의 정수 — 정확한 행 수.
-
음의 정수 — 마지막 N개 행 반환.
-
열린 범위
(0, 1)의 실수 — 결과의 그 몫을 반환.
이 설정은 결과를 만드는 SELECT/UNION 쿼리를 형성해요. 쓰기 쿼리(INSERT … SELECT, CREATE … AS SELECT)의 경우 소스 SELECT가 자신의 SETTINGS 절에 그것을 담을 때만 효과가 있어요. 프로필이나 세션에서 상속된 값, 또는 INSERT/CREATE 문 자체에 설정된 값은 소스 SELECT로 전파되지 않아요 — 다른 설정에 적용되는 것과 같은 비전파 규칙이에요.
load_marks_asynchronously
백그라운드 스레드 풀에서 MergeTree 마크를 비동기로 로드하여(서버 설정 load_marks_threadpool_pool_size 참고) 모든 스트림의 마크가 병렬로 로드되게 해요. 그렇지 않으면 마크가 한 스트림씩 동기적으로 로드되는데, JSON 같은 많은 서브스트림이 있는 컬럼의 원격 디스크에서 느려요.
lock_acquire_timeout
잠금 요청이 실패하기 전에 기다리는 시간(초)을 정의해요.
잠금 시간 초과는 테이블로 읽기/쓰기 작업을 실행하는 동안 교착 상태로부터 보호하는 데 사용돼요. 시간 초과가 만료되고 잠금 요청이 실패하면 ClickHouse 서버는 오류 코드 DEADLOCK_AVOIDED와 함께 "Locking attempt timed out! Possible deadlock avoided. Client should retry." 예외를 던져요.
가능한 값:
-
양의 정수(초).
-
0— 잠금 시간 초과 없음.
low_priority_query_wait_time_ms
쿼리 우선순위 메커니즘이 사용될 때(priority 설정 참고) 낮은 우선순위 쿼리는 높은 우선순위 쿼리가 끝나기를 기다려요. 이 설정은 대기 시간을 지정해요.
make_distributed_plan
분산 쿼리 플랜을 만들어요. 활성화하면 분산 쿼리 플랜이 아직 지원하지 않는 기능을 제어하는 설정을 자동으로 조정해요:
-
enable_parallel_replicas = 0및automatic_parallel_replicas_mode = 0— 분산 플랜이 자신의 작업 분배를 해요. -
correlated_subqueries_use_in_memory_buffer = 0. -
compile_expressions = 0. -
query_plan_direct_read_from_text_index = 0.
merge_table_max_tables_to_look_for_schema_inference
명시적 스키마 없이 Merge 테이블을 만들거나 merge 테이블 함수를 사용할 때, 지정된 수 이하의 일치 테이블의 합집합으로 스키마를 추론해요. 그보다 많은 테이블이 있으면 처음 지정된 수의 테이블에서 스키마가 추론돼요.
mongodb_throw_on_unsupported_query
활성화하면 MongoDB 쿼리를 만들 수 없을 때 MongoDB 테이블이 오류를 반환해요. 그렇지 않으면 ClickHouse가 전체 테이블을 읽고 로컬로 처리해요.
multiple_joins_try_to_keep_original_names
여러 조인 재작성 시 최상위 표현식 목록에 별칭을 추가하지 않아요.
normalize_function_names
함수 이름을 정규 이름으로 정규화해요.
offset
쿼리에서 행을 반환하기 시작하기 전에 건너뛸 행 수를 설정해요. OFFSET 절이 설정한 오프셋을 조정해요. 값은 OFFSET으로 전달되며, OFFSET이 받아들이는 모든 것(음수 값과 (0, 1)의 분수 포함)을 받아들여요.
가능한 값:
-
0— 건너뛰는 행 없음. -
양의 정수.
-
음의 정수.
-
열린 범위
(0, 1)의 실수 — 결과의 그 몫을 건너뜀.
예시 입력 테이블:
CREATE TABLE test (i UInt64) ENGINE = MergeTree() ORDER BY i;
INSERT INTO test SELECT number FROM numbers(500);
쿼리:
SET limit = 5;
SET offset = 7;
SELECT * FROM test LIMIT 10 OFFSET 100;
결과:
┌───i─┐
│ 107 │
│ 108 │
│ 109 │
└─────┘
이 설정은 결과를 만드는 SELECT/UNION 쿼리를 형성해요. 쓰기 쿼리(INSERT … SELECT, CREATE … AS SELECT)의 경우 소스 SELECT가 자신의 SETTINGS 절에 그것을 담을 때만 효과가 있어요. 프로필이나 세션에서 상속된 값, 또는 INSERT/CREATE 문 자체에 설정된 값은 소스 SELECT로 전파되지 않아요 — 다른 설정에 적용되는 것과 같은 비전파 규칙이에요.
order
쿼리에 래핑 서브쿼리로 ORDER BY 절을 추가해요. 임의 표현식 목록을 받아들여요.
이것은 엔진이 파싱된 쿼리에 적용하는 쿼리 구성 설정이에요(파생 테이블로 래핑). 따라서 기존 쿼리와 결합되고 모든 프로토콜에서 동작해요: HTTP URL 매개변수, 쿼리 내 SETTINGS 절, 또는 사용자 프로필로 제공할 수 있어요.
결과를 만드는 SELECT/UNION 쿼리를 형성해요. 쓰기 쿼리(INSERT … SELECT, CREATE … AS SELECT)의 경우 소스 SELECT가 자신의 SETTINGS 절에 그것을 담을 때만 효과가 있어요. 프로필이나 세션에서 상속된 값, 또는 INSERT/CREATE 문 자체에 설정된 값은 소스 SELECT로 전파되지 않아요 — 다른 설정에 적용되는 것과 같은 비전파 규칙이에요.
output_format
쿼리의 출력 형식을 재정의해요. 쿼리, 파일 확장자, 또는 default_format에 지정된 형식을 이깁니다.
page
페이징된 결과의 페이지 번호를 설정해요. offset = limit * (page - 1)과 동일해요. limit가 설정되고 offset이 설정되지 않은 경우에만 지정할 수 있어요. 페이지는 1부터 시작해요. limit과 offset과 같은 음수/분수 지원을 상속받아요.
이것은 엔진이 파싱된 쿼리에 적용하는 쿼리 구성 설정이에요(파생 테이블로 래핑). 따라서 기존 쿼리와 결합되고 모든 프로토콜에서 동작해요: HTTP URL 매개변수, 쿼리 내 SETTINGS 절, 또는 사용자 프로필로 제공할 수 있어요.
결과를 만드는 SELECT/UNION 쿼리를 형성해요. 쓰기 쿼리(INSERT … SELECT, CREATE … AS SELECT)의 경우 소스 SELECT가 자신의 SETTINGS 절에 그것을 담을 때만 효과가 있어요. 프로필이나 세션에서 상속된 값, 또는 INSERT/CREATE 문 자체에 설정된 값은 소스 SELECT로 전파되지 않아요 — 다른 설정에 적용되는 것과 같은 비전파 규칙이에요.
paimon_target_snapshot_id
Paimon 증분 모드에 대한 쿼리 수준 목표 스냅샷 읽기예요. > 0이면 판독기가 커밋된 워터마크를 진행하지 않고 지정된 snapshot_id의 델타만 가져와요.
기본값: -1(비활성화).
parallelize_output_from_storages
저장소에서 읽기 단계의 출력을 병렬화해요. 가능하면 저장소에서 읽은 직후 쿼리 처리를 병렬화할 수 있게 해요.
partial_result_on_first_cancel
취소 후 쿼리가 부분 결과를 반환할 수 있게 해요.
per_part_index_stats
파트별 인덱스 통계를 기록해요.
poll_interval
서버의 쿼리 대기 루프에서 지정된 초 동안 블로킹해요.
polyglot_dialect
polyglot 트랜스파일러의 소스 SQL 방언이에요(예: sqlite, mysql, postgresql, snowflake, duckdb).
postgresql_fault_injection_probability
내부(복제용) PostgreSQL 쿼리를 실패시킬 대략적인 확률이에요. 유효 값은 [0.0f, 1.0f] 구간이에요.
predicate_statistics_sample_rate
system.predicate_statistics_log로 조건 선택성 통계를 수집해요. N > 0으로 설정하면 약 1/N의 쿼리가(쿼리 ID로) 샘플링돼요. 0은 비활성화를 의미해요.
prefetch_buffer_size
파일시스템에서 읽을 프리페치 버퍼의 최대 크기예요. 256 MiB를 초과하는 값은 256 MiB로 제한되는데, 읽기 버퍼는 그보다 커질 필요가 없기 때문이에요.
print_pretty_type_names
깊게 중첩된 타입 이름을 DESCRIBE 쿼리와 toTypeName() 함수에서 들여쓰기로 예쁘게 인쇄할 수 있게 해요.
예:
CREATE TABLE test (a Tuple(b String, c Tuple(d Nullable(UInt64), e Array(UInt32), f Array(Tuple(g String, h Map(String, Array(Tuple(i String, j UInt64))))), k Date), l Nullable(String))) ENGINE=Memory;
DESCRIBE TABLE test FORMAT TSVRaw SETTINGS print_pretty_type_names=1;
a Tuple(
b String,
c Tuple(
d Nullable(UInt64),
e Array(UInt32),
f Array(Tuple(
g String,
h Map(
String,
Array(Tuple(
i String,
j UInt64
))
)
)),
k Date
),
l Nullable(String)
)
priority
쿼리의 우선순위예요. 1 - 가장 높음, 값이 클수록 낮은 우선순위. 0 - 우선순위를 사용하지 않음.
push_external_roles_in_interserver_queries
쿼리를 수행하는 동안 원본자(originator)에서 다른 노드로 사용자 역할을 푸시하는 것을 활성화해요.
query_metric_log_interval
개별 쿼리에 대한 query_metric_log을 수집하는 간격(밀리초)이에요.
음수 값으로 설정하면 query_metric_log 설정의 collect_interval_milliseconds 값을 사용하거나, 없으면 기본적으로 1000을 사용해요.
단일 쿼리의 수집을 비활성화하려면 query_metric_log_interval을 0으로 설정해요.
기본값: -1.
queue_max_wait_ms
동시 요청 수가 최대를 초과할 때 요청 큐에서의 대기 시간이에요.
rabbitmq_max_wait_ms
재시도 전에 RabbitMQ에서 읽는 대기 시간이에요.
readonly
0 - 읽기 전용 제한 없음. 1 - 읽기 요청만, 그리고 명시적으로 허용된 설정 변경만. 2 - 읽기 요청만, 그리고 readonly 설정을 제외한 설정 변경만.
recursive_cte_max_steps_in_type_inference
재귀 CTE에서 컬럼 타입을 추론하기 위한 최대 반복 횟수예요. 컬럼 타입은 UNION ALL의 비재귀 측과 재귀 측에 getLeastSupertype를 반복 적용하여 수렴할 때까지 결정돼요. 타입 확장을 비활성화하고 비재귀 부분의 타입만 사용하려면 0으로 설정해요.
regexp_max_matches_per_row
행당 단일 정규식의 최대 일치 수를 설정해요. extractAllGroupsHorizontal 함수에서 탐욕 정규식을 사용할 때 메모리 과부하를 방지하는 데 사용해요. 가능한 값:
- 양의 정수.
reject_expensive_hyperscan_regexps
hyperscan으로 평가하기에 비용이 들 것 같은 패턴(NFA 상태 폭발로 인해)을 거부해요.
remerge_sort_lowered_memory_bytes_ratio
remerge 후 메모리 사용량이 이 비율만큼 줄지 않으면 remerge가 비활성화돼요.
remote_read_min_bytes_for_seek
원격 읽기(url, s3)가 무시하고 읽는 대신 seek을 하기 위해 필요한 최소 바이트 수예요.
rename_files_after_processing
-
타입: String
-
기본값: 빈 문자열
이 설정은 file 테이블 함수가 처리한 파일에 대한 이름 변경 패턴을 지정할 수 있게 해요. 옵션이 설정되면 file 테이블 함수가 읽은 모든 파일이, 처리가 성공한 경우에만 자리표시자가 있는 지정된 패턴에 따라 이름이 바뀌어요.
이름 변경은 소스에 대한 쓰기이므로, 이 옵션으로 파일을 읽는 쿼리는 READ ON FILE 외에 WRITE ON FILE 권한이 필요해요. DESCRIBE는 이름을 바꾸는 데이터 읽기 파이프라인을 만들지 않으므로 READ ON FILE만 필요해요.
자리표시자
-
%a— 전체 원본 파일 이름(예: "sample.csv"). -
%f— 확장자 없는 원본 파일 이름(예: "sample"). -
%e— 점이 있는 원본 파일 확장자(예: ".csv"). -
%t— 타임스탬프(마이크로초). -
%%— 백분율 기호("%").
예시
-
옵션:
--rename_files_after_processing="processed_%f_%t%e" -
쿼리:
SELECT * FROM file('sample.csv')
sample.csv 읽기가 성공하면 파일이 processed_sample_1683473210851438.csv로 이름이 바뀌어요.
replication_wait_for_inactive_replica_timeout
비활성 레플리카가 ALTER, OPTIMIZE 또는 TRUNCATE 쿼리를 실행하기를 기다리는 시간(초)을 지정해요. 가능한 값:
-
0— 기다리지 않아요. -
음의 정수 — 무제한으로 기다려요.
-
양의 정수 — 기다리는 초 수.
reserve_memory
워크로드 스케줄링에서 사용돼요. 단일 서버에서 쿼리를 실행하기 위해 예약되는 최소 RAM 양이에요. 예약은 워크로드 쿼리 설정 값으로 WORKLOAD 계층을 통해 이루어져요.
워크로드에 충분한 메모리가 없으면 쿼리는 시작이 방지되고 예약이 충족될 때까지 대기 상태로 기다려요.
0은 예약 없음을 의미해요.
이 설정은 MEMORY RESERVATION 리소스가 생성된 경우에만 효과가 있어요.
restore_replicated_merge_tree_to_shared_merge_tree
RESTORE 중 테이블 엔진을 Replicated*MergeTree → Shared*MergeTree로 대체해요.
Cloud 기본값: 1.
result_overflow_mode
결과 양이 제한 중 하나를 초과하면 어떻게 할지 설정해요. 가능한 값:
-
throw: 예외를 던져요(기본값). -
break: 쿼리 실행을 중단하고, 소스 데이터가 소진된 것처럼 부분 결과를 반환해요.
break를 사용하는 것은 LIMIT를 사용하는 것과 유사해요. break는 블록 수준에서만 실행을 중단해요. 즉, 반환된 행 수는 max_result_rows보다 크고, max_block_size의 배수이며, max_threads에 따라 달라져요.
예시
쿼리
SET max_threads = 3, max_block_size = 3333;
SET max_result_rows = 3334, result_overflow_mode = 'break';
SELECT *
FROM numbers_mt(100000)
FORMAT Null;
결과
6666 rows in set. ...
resumable_backup_from_snapshot
재개 가능한 BACKUP FROM SNAPSHOT을 활성화해요: 실패한 시도를 이미 완료된 배치의 항목을 다시 복사하지 않고 다시 실행할 수 있어요. ClickHouse Cloud에서만 사용 가능하며, directory 스타일의 S3와 AzureBlobStorage 대상에 대해요. ClickHouse 오픈소스 빌드에서 활성화하면(BACKUP FROM SNAPSHOT 자체를 사용할 수 없음) BACKUP이 WRONG_BACKUP_SETTINGS로 실패해요.
rows_before_aggregation
활성화하면 ClickHouse가 rows_before_aggregation 통계에 대해 정확한 값을 제공하며, 집계 전에 읽힌 행 수를 나타내요.
run_query_in_background
활성화하면 서버가 쿼리를 백그라운드로 예약하고 즉시 빈 성공 결과를 반환하며, 연결에 무슨 일이 생기든 쿼리를 완료까지 실행해요.
백그라운드 쿼리는 서버 재시작을 견디지 못해요. 종료 시 포그라운드 쿼리와 같은 서버 설정을 따르고, shutdown_wait_unfinished_queries는 취소와 대기 중 선택해요(큐에 있던 항목은 어느 쪽이든 system.query_log 항목 없이 버려져요). shutdown_wait_unfinished는 서버가 기다리는 시간을 제한해요.
쿼리를 query_id로 추적해요: 실행 중에는 system.processes에서, 종료 후 쿼리 로그 항목이 플러시되면 system.query_log에서.
네이티브 TCP와 HTTP 프로토콜로 받은 쿼리에 적용돼요. HTTP에서는 설정을 URL 매개변수로 전달해요. SET으로 변경할 수 없어요. 쿼리별로, 또는 사용자/프로필 수준에서 활성화해요.
주요 사용 사례는 클라이언트 연결이 끊겨도 잃어서는 안 되는 긴 INSERT ... SELECT예요.
secondary_indices_enable_bulk_filtering
인덱스에 대한 벌크 필터링 알고리즘을 활성화해요. 항상 더 나을 것으로 예상되지만 호환성과 제어를 위해 이 설정이 있어요.
select
쿼리를 명시적 SELECT 표현식 목록이 있는 서브쿼리로 래핑해요. 비어 있지 않으면 결과를 만드는 쿼리가 SELECT <expr_list> FROM (<query>)로 래핑돼요.
이것은 엔진이 파싱된 쿼리에 적용하는 쿼리 구성 설정이에요(파생 테이블로 래핑). 따라서 기존 쿼리와 결합되고 모든 프로토콜에서 동작해요: HTTP URL 매개변수, 쿼리 내 SETTINGS 절, 또는 사용자 프로필로 제공할 수 있어요.
결과를 만드는 SELECT/UNION 쿼리를 형성해요. 쓰기 쿼리(INSERT … SELECT, CREATE … AS SELECT)의 경우 소스 SELECT가 자신의 SETTINGS 절에 그것을 담을 때만 효과가 있어요. 프로필이나 세션에서 상속된 값, 또는 INSERT/CREATE 문 자체에 설정된 값은 소스 SELECT로 전파되지 않아요 — 다른 설정에 적용되는 것과 같은 비전파 규칙이에요.
select_sequential_consistency
이 설정은 SharedMergeTree와 ReplicatedMergeTree에서 동작이 달라요. SharedMergeTree에서 select_sequential_consistency의 동작에 대한 자세한 내용은 SharedMergeTree consistency를 참고하세요.
SELECT 쿼리에 대한 순차 일관성을 활성화 또는 비활성화해요. insert_quorum_parallel이 비활성화되어야 해요(기본적으로 활성화).
가능한 값:
-
0— 비활성화. -
1— 활성화.
사용법
순차 일관성이 활성화되면 ClickHouse는 클라이언트가 insert_quorum으로 실행된 이전 모든 INSERT 쿼리의 데이터를 포함한 레플리카에 대해서만 SELECT 쿼리를 실행하도록 허용해요. 클라이언트가 부분 레플리카를 참조하면 ClickHouse는 예외를 생성해요. SELECT 쿼리는 아직 레플리카 쿼럼에 기록되지 않은 데이터를 포함하지 않아요.
insert_quorum_parallel이 활성화되면(기본값) select_sequential_consistency가 동작하지 않아요. 병렬 INSERT 쿼리가 서로 다른 쿼럼 레플리카 집합에 기록될 수 있으므로 단일 레플리카가 모든 쓰기를 받았다는 보장이 없기 때문이에요.
함께 보기:
session_query_ids_history_size
system.session_query_ids 시스템 테이블을 통해 노출되는 세션 로컬 기록에 보관되는 최대 쿼리 ID 수예요.
세션에서 실행된 모든 비내부 쿼리의 쿼리 ID가 쿼리 시작 시 거기 기록되며, 기록이 이 크기를 초과하면 가장 오래된 항목이 먼저 축출돼요.
값은 쿼리가 파싱되기 전인 쿼리 시작 시 읽히므로, 쿼리 자신의 SETTINGS 절은 그 쿼리가 기록되는지에 영향을 주지 않아요. 대신 SET, HTTP URL 매개변수, 또는 설정 프로필을 사용해요.
가능한 값:
-
양의 정수.
-
0— 기록 비활성화. 이전에 기록된 항목은 테이블에 남아요.
session_timezone
현재 세션 또는 쿼리의 암시적 시간대를 설정해요.
암시적 시간대는 명시적으로 지정된 시간대가 없는 DateTime/DateTime64 타입 값에 적용되는 시간대예요.
이 설정은 전역적으로 구성된(서버 수준) 암시적 시간대보다 우선해요.
값 ''(빈 문자열)은 현재 세션 또는 쿼리의 암시적 시간대가 서버 시간대와 같음을 의미해요.
세션 시간대와 서버 시간대를 얻으려면 timeZone()과 serverTimeZone() 함수를 사용할 수 있어요.
가능한 값:
system.time_zones의 임의 시간대 이름(예:Europe/Berlin,UTC,Zulu).
예시:
SELECT timeZone(), serverTimeZone() FORMAT CSV
"Europe/Berlin","Europe/Berlin"
SELECT timeZone(), serverTimeZone() SETTINGS session_timezone = 'Asia/Novosibirsk' FORMAT CSV
"Asia/Novosibirsk","Europe/Berlin"
명시적으로 지정된 시간대가 없는 내부 DateTime에 세션 시간대 'America/Denver'를 할당:
SELECT toDateTime64(toDateTime64('1999-12-12 23:23:23.123', 3), 3, 'Europe/Zurich') SETTINGS session_timezone = 'America/Denver' FORMAT TSV
1999-12-13 07:23:23.123
DateTime/DateTime64를 파싱하는 모든 함수가 session_timezone을 존중하는 것은 아니에요. 이것은 미묘한 오류로 이어질 수 있어요.
다음 예시와 설명을 보세요.
CREATE TABLE test_tz (`d` DateTime('UTC')) ENGINE = Memory AS SELECT toDateTime('2000-01-01 00:00:00', 'UTC');
SELECT *, timeZone() FROM test_tz WHERE d = toDateTime('2000-01-01 00:00:00') SETTINGS session_timezone = 'Asia/Novosibirsk'
0 rows in set.
SELECT *, timeZone() FROM test_tz WHERE d = '2000-01-01 00:00:00' SETTINGS session_timezone = 'Asia/Novosibirsk'
┌───────────────────d─┬─timeZone()───────┐
│ 2000-01-01 00:00:00 │ Asia/Novosibirsk │
└─────────────────────┴──────────────────┘
이것은 다른 파싱 파이프라인 때문이에요:
-
첫 번째
SELECT쿼리에서 명시적 시간대 없이 사용된toDateTime()은 설정session_timezone과 전역 시간대를 존중해요. -
두 번째 쿼리에서
DateTime은String에서 파싱되고 기존 컬럼d의 타입과 시간대를 상속받아요. 따라서 설정session_timezone과 전역 시간대가 존중되지 않아요.
함께 보기
set_overflow_mode
데이터 양이 제한 중 하나를 초과하면 어떻게 할지 설정해요. 가능한 값:
-
throw: 예외를 던져요(기본값). -
break: 쿼리 실행을 중단하고, 소스 데이터가 소진된 것처럼 부분 결과를 반환해요.
single_join_prefer_left_table
단일 JOIN에서 식별자 모호성이 있을 때 왼쪽 테이블을 선호해요.
skip_redundant_aliases_in_udf
사용자 정의 함수에서 중복 별칭을 사용(대체)하지 않아 사용을 단순화해요. 가능한 값:
-
1— UDF에서 별칭이 건너뛰어져요(대체됨). -
0— UDF에서 별칭이 건너뛰어지지 않아요(대체되지 않음).
예시 활성화와 비활성화의 차이: 쿼리:
SET skip_redundant_aliases_in_udf = 0;
CREATE FUNCTION IF NOT EXISTS test_03274 AS ( x ) -> ((x + 1 as y, y + 2));
EXPLAIN SYNTAX SELECT test_03274(4 + 2);
결과:
SELECT ((4 + 2) + 1 AS y, y + 2)
쿼리:
SET skip_redundant_aliases_in_udf = 1;
CREATE FUNCTION IF NOT EXISTS test_03274 AS ( x ) -> ((x + 1 as y, y + 2));
EXPLAIN SYNTAX SELECT test_03274(4 + 2);
결과:
SELECT ((4 + 2) + 1, ((4 + 2) + 1) + 2)
sleep_after_receiving_query_ms
TCPHandler에서 쿼리를 받은 후 잠자는 시간이에요.
snappy_mode
file, url 같은 일반 파일 I/O 경로에 대한 snappy 압축의 와이어 형식을 제어해요. HTTP Content-Encoding: snappy는 항상 프레이밍 형식을 사용하며 이 설정을 무시해요.
단일 snappy::Compress 호출이 만든 원시 snappy 블록 형식(SnappyBasicReadBuffer가 처리하는 Prometheus 원격 프로토콜 페이로드 같은)은 별도의 프로토콜 특정 와이어 형식이며 이 설정으로 제어되지 않아요.
가능한 값:
-
basic— Hadoop snappy 블록 형식. Hadoop이 읽고 쓴 파일과 호환돼요. 읽기와 쓰기 모두 지원해요. -
framed— Snappy 프레이밍 형식, Google이 정의한 표준 스트리밍 형식. 읽기와 쓰기 모두 지원해요.
sort
쿼리에 래핑 서브쿼리로 단순 ORDER BY 절을 추가해요. 선택적 +(ASC) 또는 -(DESC) 접두사가 있는 식별자 또는 위치 컬럼 참조(양의 정수)의 쉼표로 구분된 목록을 받아들여요. 예: sort=a,-b는 a 오름차순, b 내림차순으로 정렬하고, sort=1,-2는 첫 번째 컬럼 오름차순, 두 번째 내림차순으로 정렬해요. order와 결합할 수 없어요.
이것은 엔진이 파싱된 쿼리에 적용하는 쿼리 구성 설정이에요(파생 테이블로 래핑). 따라서 기존 쿼리와 결합되고 모든 프로토콜에서 동작해요: HTTP URL 매개변수, 쿼리 내 SETTINGS 절, 또는 사용자 프로필로 제공할 수 있어요.
결과를 만드는 SELECT/UNION 쿼리를 형성해요. 쓰기 쿼리(INSERT … SELECT, CREATE … AS SELECT)의 경우 소스 SELECT가 자신의 SETTINGS 절에 그것을 담을 때만 효과가 있어요. 프로필이나 세션에서 상속된 값, 또는 INSERT/CREATE 문 자체에 설정된 값은 소스 SELECT로 전파되지 않아요 — 다른 설정에 적용되는 것과 같은 비전파 규칙이에요.
sort_overflow_mode
정렬 전에 받은 행 수가 제한 중 하나를 초과하면 어떻게 할지 설정해요. 가능한 값:
-
throw: 예외를 던져요. -
break: 쿼리 실행을 중단하고 부분 결과를 반환해요.
splitby_max_substrings_includes_remaining_string
max_substrings > 0 인자를 가진 splitBy*() 함수가 결과 배열의 마지막 요소에 남은 문자열을 포함할지 여부를 제어해요.
가능한 값:
-
0- 남은 문자열이 결과 배열의 마지막 요소에 포함되지 않아요. -
1- 남은 문자열이 결과 배열의 마지막 요소에 포함돼요. 이것은 Spark의 split() 함수와 Python의 'string.split()' 메서드의 동작이에요.
statistics_max_set_size_for_exact_selectivity_estimation
선택성 추정기가 집합이 다루는 정확한 범위를 파생하는 IN 연산자 오른쪽 집합의 최대 크기예요. 그것들을 파생하려면 요소당 Field, 정렬, 요소당 하나의 통계 프로브가 필요한데, 큰 집합의 경우 쿼리 플래닝을 지배해요. 이 제한 위에서는 추정기가 대신 집합의 크기와 그 경계 범위에서 선택성을 파생하는데, 이는 정렬이나 요소별 통계 프로브 없이 집합에 대한 단일 선형 패스예요. 0은 제한 없음을 의미해요.
stop_refreshable_materialized_views_on_startup
서버 시작 시 SYSTEM STOP VIEWS인 것처럼 새로고침 가능한 머티리얼라이즈드 뷰의 스케줄링을 방지해요. 이후 SYSTEM START VIEWS나 SYSTEM START VIEW <name>으로 수동으로 시작할 수 있어요. 새로 생성된 뷰에도 적용돼요. 새로고침 불가능한 머티리얼라이즈드 뷰에는 효과가 없어요.
tcp_keep_alive_timeout
TCP가 keepalive 프로브를 보내기 시작하기 전에 연결이 유휴 상태로 남아 있어야 하는 시간(초)이에요.
temporary_data_in_cache_reserve_space_wait_lock_timeout_milliseconds
파일시스템 캐시에서 임시 데이터의 공간 예약을 위해 캐시를 잠그는 대기 시간이에요.
throw_if_no_data_to_insert
빈 INSERT를 허용하거나 금지해요. 기본적으로 활성화돼요(빈 삽입 시 오류 발생). clickhouse-client 또는 gRPC 인터페이스를 사용하는 INSERT에만 적용돼요.
time_series_prefer_recent_samples_table
요청된 전체 시간 범위가 최근 샘플 테이블의 TTL 창 안에 들어맞을 때, TimeSeries 테이블의 최근 샘플 테이블에서 기본 샘플 테이블 대신 읽어요(TimeSeries 테이블 엔진의 recent_samples_ttl_seconds 설정 참고).
timeout_before_checking_execution_speed
지정된 시간(초)이 경과한 후 실행 속도가 너무 느리지 않은지(min_execution_speed 이상) 확인해요.
transfer_overflow_mode
데이터 양이 제한 중 하나를 초과하면 어떻게 할지 설정해요. 가능한 값:
-
throw: 예외를 던져요(기본값). -
break: 쿼리 실행을 중단하고, 소스 데이터가 소진된 것처럼 부분 결과를 반환해요.
transform_null_in
IN 연산자에 대한 NULL 값의 동등성을 활성화해요.
기본적으로 NULL 값은 비교할 수 없는데, NULL이 정의되지 않은 값을 의미하기 때문이에요. 따라서 expr = NULL 비교는 항상 false를 반환해야 해요. 이 설정을 사용하면 IN 연산자에 대해 NULL = NULL이 true를 반환해요.
가능한 값:
-
0—IN연산자에서NULL값의 비교가false를 반환해요. -
1—IN연산자에서NULL값의 비교가true를 반환해요.
예시
null_in 테이블을 고려해요:
┌──idx─┬─────i─┐
│ 1 │ 1 │
│ 2 │ NULL │
│ 3 │ 3 │
└──────┴───────┘
쿼리:
SELECT idx, i FROM null_in WHERE i IN (1, NULL) SETTINGS transform_null_in = 0;
결과:
┌──idx─┬────i─┐
│ 1 │ 1 │
└──────┴──────┘
쿼리:
SELECT idx, i FROM null_in WHERE i IN (1, NULL) SETTINGS transform_null_in = 1;
결과:
┌──idx─┬─────i─┐
│ 1 │ 1 │
│ 2 │ NULL │
└──────┴───────┘
함께 보기
traverse_shadow_remote_data_paths
system.remote_data_paths를 조회할 때 실제 테이블 데이터 외에 동결된 데이터(shadow 디렉터리)도 탐색해요.
union_default_mode
SELECT 쿼리 결과를 결합하는 모드를 설정해요. 이 설정은 UNION ALL 또는 UNION DISTINCT를 명시적으로 지정하지 않은 UNION과 함께 사용될 때만 사용돼요.
가능한 값:
-
'DISTINCT'— ClickHouse가 쿼리 결합 결과로 중복 행을 제거해 행을 출력해요. -
'ALL'— ClickHouse가 쿼리 결합 결과로 중복 행을 포함한 모든 행을 출력해요. -
''—UNION과 함께 사용되면 ClickHouse가 예외를 생성해요.
예시는 UNION에서 확인할 수 있어요.
unknown_packet_in_send_data
데이터 대신 N번째 데이터 패킷에 알 수 없는 패킷을 보내요.
variant_throw_on_type_mismatch
Variant 컬럼에 기본 구현으로 함수를 적용할 때, 실제 타입이 함수와 호환되지 않는 행에 대해 어떻게 할지 제어해요:
-
true(기본값) — 예외를 던져요. -
false— 그런 행에 대해NULL을 반환해요.
wait_changes_become_visible_after_commit_mode
커밋된 변경이 최신 스냅샷에서 실제로 보이게 될 때까지 기다려요.
workload
리소스에 접근하기 위해 사용할 워크로드의 이름이에요.
workload_admission_timeout_ms
쿼리가 시작하지 않고 실패하기 전에 워크로드 스케줄링에 의해 허용되기를 기다리는 최대 시간이에요.
그것은 쿼리 슬롯(CREATE RESOURCE ... (QUERY) 리소스에서, 워크로드의 max_concurrent_queries로 제한)과 메모리 예약(CREATE RESOURCE ... (MEMORY RESERVATION) 리소스와 reserve_memory 설정)의 결합 대기를 제한해요. 둘 다 쿼리가 실행을 시작하기 전에 획득되므로, 그 실행 전 대기를 제한하는 유일한 방법이에요: max_execution_time은 쿼리가 아직 시작하지 않았으므로 적용되지 않아요.
시간 초과가 만료되면 쿼리는 기다리고 있던 리소스에 따라 두 가지 서로 다른 오류 중 하나로 실패해요: 쿼리 슬롯은 QUERY_SLOT_ACQUISITION_TIMEOUT, 메모리 예약은 MEMORY_RESERVATION_ACQUISITION_TIMEOUT.
가능한 값:
-
양의 정수 — 밀리초 단위 시간 초과.
-
0— 무한 시간 초과: 쿼리가 허용을 무기한 기다려요(기본값). 워크로드의max_waiting_queries제한에 도달하면 여전히 즉시 거부될 수 있어요.
write_full_path_in_iceberg_metadata
iceberg 메타데이터 파일에 전체 경로(s3:// 포함)를 써요.
zstd_window_log_max
ZSTD의 최대 window log를 선택할 수 있게 해요(MergeTree 계열에는 사용되지 않음).