force(강제) 관련 설정

force(강제) 관련 설정

특정 최적화나 인덱스가 사용되지 않을 때 쿼리 실행을 중단시키도록 강제하는 force_* 설정들을 소개해요. 데이터 스킵핑 인덱스, 날짜 인덱스, 프라이머리 키 사용 검증 등에 활용된답니다. 이 설정들은 system.settings 테이블에서 확인할 수 있고 소스 코드에서 자동 생성된 값들이에요.

출처: 문서

본문

이 설정들은 system.settings에서 확인할 수 있고, 소스 코드에서 자동 생성된 값들이에요.

force_aggregate_partitions_independently

적용 가능하지만 휴리스틱이 사용하지 않기로 결정했을 때 최적화 사용을 강제해요.

force_aggregation_in_order

이 설정은 서버가 분산 쿼리를 지원하기 위해 스스로 사용해요. 정상적인 작동을 깨뜨리므로 수동으로 변경하지 마세요. (분산 집계 중 원격 노드에서 순서대로 집계를 사용하도록 강제합니다.)

force_creating_set_partitions_independently

적용 가능하지만 파티션-스큐 검사(가장 큰 파티션이 평균의 두 배를 초과)가 사용하지 않기로 결정했을 때 IN (subquery) set 구성에 대해 파티션별 사전-중복 제거를 강제해요. allow_creating_set_partitions_independently의 스큐 검사만 우회하고, 나머지 조건은 여전히 적용돼요.

force_data_skipping_indices

전달된 데이터 스킵핑 인덱스가 사용되지 않으면 쿼리 실행을 중단해요.

다음 예를 생각해 보세요:

CREATE TABLE data
(
    key Int,
    d1 Int,
    d1_null Nullable(Int),
    INDEX d1_idx d1 TYPE minmax GRANULARITY 1,
    INDEX d1_null_idx assumeNotNull(d1_null) TYPE minmax GRANULARITY 1
)
Engine=MergeTree()
ORDER BY key;

SELECT * FROM data_01515;
SELECT * FROM data_01515 SETTINGS force_data_skipping_indices=''; -- CANNOT_PARSE_TEXT 오류 발생
SELECT * FROM data_01515 SETTINGS force_data_skipping_indices='d1_idx'; -- INDEX_NOT_USED 오류 발생
SELECT * FROM data_01515 WHERE d1 = 0 SETTINGS force_data_skipping_indices='d1_idx'; -- 정상
SELECT * FROM data_01515 WHERE d1 = 0 SETTINGS force_data_skipping_indices='`d1_idx`'; -- 정상 (전체 기능 파서 예)
SELECT * FROM data_01515 WHERE d1 = 0 SETTINGS force_data_skipping_indices='`d1_idx`, d1_null_idx'; -- d1_null_idx가 사용되지 않아 INDEX_NOT_USED 오류 발생
SELECT * FROM data_01515 WHERE d1 = 0 AND assumeNotNull(d1_null) = 0 SETTINGS force_data_skipping_indices='`d1_idx`, d1_null_idx'; -- 정상

force_distinct_partitions_independently

적용 가능하지만 비용 휴리스틱이 사용하지 않기로 결정했을 때 파티션별 독립 DISTINCT 평가를 강제해요. allow_distinct_partitions_independently의 비용 휴리스틱만 우회하고, 나머지 조건은 여전히 적용돼요.

force_grouping_standard_compatibility

인자가 집계 키로 사용되지 않을 때 GROUPING 함수가 1을 반환하도록 해요.

force_index_by_date

인덱스를 날짜로 사용할 수 없으면 쿼리 실행을 중단해요.

MergeTree 계열의 테이블에서 작동해요. force_index_by_date=1이면 ClickHouse는 쿼리에 데이터 범위를 제한하는 데 사용할 수 있는 날짜 키 조건이 있는지 확인해요. 적절한 조건이 없으면 예외를 던져요. 하지만 조건이 읽을 데이터 양을 줄이는지는 확인하지 않아요. 예를 들어 Date != ' 2000-01-01 ' 조건은 테이블의 모든 데이터와 일치하더라도(즉 전체 스캔이 필요하더라도) 허용돼요. MergeTree 테이블의 데이터 범위에 대한 자세한 내용은 MergeTree를 참조하세요.

force_primary_key

프라이머리 키로 인덱싱할 수 없으면 쿼리 실행을 중단해요.

MergeTree 계열의 테이블에서 작동해요. force_primary_key=1이면 ClickHouse는 쿼리에 데이터 범위를 제한하는 데 사용할 수 있는 프라이머리 키 조건이 있는지 확인해요. 적절한 조건이 없으면 예외를 던져요. 하지만 조건이 읽을 데이터 양을 줄이는지는 확인하지 않아요. MergeTree 테이블의 데이터 범위에 대한 자세한 내용은 MergeTree를 참조하세요.

force_read_through_distributed_cache

ClickHouse Cloud에서만 효과가 있어요. 단일 쿼리에 대해 서버 설정 enable_read_through_distributed_cache를 재정의해요. auto(기본값)는 서버 설정을 따르는 것을 의미해요.

force_remove_data_recursively_on_drop

DROP 쿼리에서 데이터를 재귀적으로 제거해요. 'Directory not empty' 오류를 피하지만 분리된(detached) 데이터를 조용히 제거할 수 있어요.

force_window_partitions_independently

적용 가능하지만 비용 휴리스틱이 사용하지 않기로 결정했을 때 파티션별 윈도우 함수의 독립 평가를 강제해요. allow_window_partitions_independently의 비용 휴리스틱만 우회하고, 나머지 조건은 여전히 적용돼요.

force_write_through_distributed_cache

ClickHouse Cloud에서만 효과가 있어요. 단일 쿼리에 대해 서버 설정 enable_write_through_distributed_cache를 재정의해요. auto(기본값)는 서버 설정을 따르는 것을 의미해요.

더 알아보기 (Learn more)