prefer_* 세션 설정
prefer_* 세션 설정
이 페이지에서는 특정 동작을 선호하는 다양한 prefer_* 세션 설정들을 다뤄요. 별칭보다 원래 컬럼 이름 사용, GLOBAL IN/GLOBAL JOIN 대체, 로컬호스트 레플리카 선호, 프로젝션 선호 등을 제어해요. 이 설정들은 system.settings 테이블에서 확인할 수 있으며 ClickHouse 소스에서 자동 생성돼요.
출처: 문서
본문
이 설정들은 system.settings에서 확인할 수 있으며 소스에서 자동 생성돼요.
prefer_column_name_to_alias
쿼리 표현식과 절에서 별칭 대신 원래 컬럼 이름을 사용하는 것을 활성화 또는 비활성화해요. 별칭이 컬럼 이름과 같을 때 특히 중요해요. Expression Aliases를 참고하세요. 이 설정을 활성화하면 ClickHouse의 별칭 구문 규칙을 대부분의 다른 데이터베이스 엔진과 더 호환되게 만들 수 있어요. 가능한 값:
-
0— 컬럼 이름이 별칭으로 대체돼요. -
1— 컬럼 이름이 별칭으로 대체되지 않아요.
조인된 테이블 사이에서 컬럼 이름이 모호하고 같은 이름의 별칭이 있으면 별칭이 사용돼요:
SET prefer_column_name_to_alias = 1;
SELECT t1.id + 10 AS id, id AS x
FROM (SELECT 1 AS id) AS t1, (SELECT 1 AS k) AS t2, (SELECT 2 AS id) AS t3;
┌─id─┬──x─┐
│ 11 │ 11 │
└────┴────┘
여기서 id AS x의 id는 t1과 t3 둘 다의 컬럼이므로 별칭 t1.id + 10으로 해석돼요.
예시
활성화와 비활성화의 차이:
쿼리:
SET prefer_column_name_to_alias = 0;
SELECT avg(number) AS number, max(number) FROM numbers(10);
결과:
Received exception from server (version 21.5.1):
Code: 184. DB::Exception: Received from localhost:9000. DB::Exception: Aggregate function avg(number) is found inside another aggregate function in query: While processing avg(number) AS number.
쿼리:
SET prefer_column_name_to_alias = 1;
SELECT avg(number) AS number, max(number) FROM numbers(10);
결과:
┌─number─┬─max(number)─┐
│ 4.5 │ 9 │
└────────┴─────────────┘
prefer_external_sort_block_bytes
외부 정렬에 최대 블록 바이트를 선호하며, 병합 중 메모리 사용량을 줄여요.
prefer_global_in_and_join
IN/JOIN 연산자를 GLOBAL IN/GLOBAL JOIN으로 대체하는 것을 활성화해요.
가능한 값:
-
0— 비활성화.IN/JOIN연산자가GLOBAL IN/GLOBAL JOIN으로 대체되지 않아요. -
1— 활성화.IN/JOIN연산자가GLOBAL IN/GLOBAL JOIN으로 대체돼요.
사용법
SET distributed_product_mode=global이 분산 테이블의 쿼리 동작을 바꿀 수는 있지만, 로컬 테이블이나 외부 리소스의 테이블에는 적합하지 않아요. 여기서 prefer_global_in_and_join 설정이 작용해요.
예를 들어, 분산에 적합하지 않은 로컬 테이블을 포함하는 쿼리 서빙 노드가 있다고 해요. 분산 처리 중에 그들의 데이터를 GLOBAL 키워드 — GLOBAL IN/GLOBAL JOIN — 로 즉석에서 분산해야 해요.
prefer_global_in_and_join의 또 다른 사용 사례는 외부 엔진이 만든 테이블에 접근하는 것이에요. 이 설정은 그러한 테이블을 조인할 때 외부 소스에 대한 호출 수를 줄이는 데 도움을 줘요: 쿼리당 한 번만 호출해요.
함께 보기:
- Distributed subqueries —
GLOBAL IN/GLOBAL JOIN사용 방법에 대한 자세한 정보
prefer_localhost_replica
분산 쿼리를 처리할 때 localhost 레플리카를 선호하는 것을 활성화/비활성화해요. 가능한 값:
-
1— ClickHouse가 존재하면 항상 localhost 레플리카로 쿼리를 보내요. -
0— ClickHouse가 load_balancing 설정에 지정된 밸런싱 전략을 사용해요.
parallel_replicas_custom_key 없이 max_parallel_replicas를 사용한다면 이 설정을 비활성화해요. parallel_replicas_custom_key가 설정되어 있으면, 여러 레플리카를 포함한 여러 샤드가 있는 클러스터에서 사용할 때만 이 설정을 비활성화해요. 단일 샤드와 여러 레플리카가 있는 클러스터에서 사용하면 비활성화가 부정적인 효과를 가져요.
prefer_optimize_projection
프로젝션 최적화가 활성화되었을 때(참고: optimize_use_projections 설정) SELECT 쿼리에서 테이블보다 projections을 선호하도록 만들어요.
활성화하면 쿼리를 서빙할 수 있는 프로젝션이 테이블 자체보다 더 많은 마크를 읽어야 하더라도 사용돼요. force_optimize_projection과 같지만, 사용할 수 있는 프로젝션이 없어도 쿼리는 실패하지 않아요.
가능한 값:
-
0— 프로젝션은 추정 비용으로 선택돼요. -
1— 사용 가능한 프로젝션이 추정 비용과 무관하게 선택돼요.
prefer_warmed_unmerged_parts_seconds
ClickHouse Cloud에서만 효과가 있어요. 병합된 파트가 그 초보다 어리지 않고 사전 워밍되지 않았으며(참고: cache_populated_by_fetch), 그 모든 소스 파트가 사용 가능하고 사전 워밍되었다면, SELECT 쿼리는 그 파트를 대신 읽어요. Replicated-/SharedMergeTree에만 해당돼요. 참고로 CacheWarmer가 파트를 처리했는지만 확인하므로, 다른 방법으로 파트가 캐시에 페치되었다면 CacheWarmer가 처리하기 전까지 여전히 콜드로 간주돼요. 워밍된 후 캐시에서 축출되면 여전히 웜으로 간주돼요.