> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# 기타 MergeTree 테이블 설정

> "기타" 생성 그룹의 ClickHouse MergeTree 테이블 설정.

export const SettingsInfoBlock = ({type, default_value, changeable_without_restart}) => {
  return <div className="not-prose" style={{
    display: "flex",
    flexWrap: "wrap",
    alignItems: "baseline",
    columnGap: "0.5rem",
    rowGap: "0.125rem",
    margin: "0.375rem 0",
    fontSize: "0.8125rem",
    lineHeight: "1.125rem"
  }}>
      <div style={{
    fontWeight: 600,
    opacity: 0.72
  }}>유형</div>
      <div style={{
    overflowWrap: "anywhere"
  }}>{type}</div>
      <div style={{
    fontWeight: 600,
    opacity: 0.72,
    marginInlineStart: "0.5rem"
  }}>기본값</div>
      <div style={{
    overflowWrap: "anywhere"
  }}>{default_value}</div>
      {changeable_without_restart && <div style={{
    fontWeight: 600,
    opacity: 0.72,
    marginInlineStart: "0.5rem"
  }}>
          재시작 없이 변경 가능
        </div>}
      {changeable_without_restart && <div style={{
    overflowWrap: "anywhere"
  }}>
          {changeable_without_restart}
        </div>}
    </div>;
};

export const ExperimentalBadge = () => {
  return <div className="experimentalBadge">
            <div className="experimentalIcon">
            <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path strokeWidth="1.25" d="M5.5 2H10.5" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.25" d="M9.50015 2V6.19625L13.4283 12.7425C13.4738 12.8183 13.4985 12.9049 13.4996 12.9934C13.5008 13.0818 13.4785 13.169 13.435 13.246C13.3914 13.323 13.3283 13.3871 13.2519 13.4317C13.1755 13.4764 13.0886 13.4999 13.0002 13.5H3.00015C2.91164 13.5 2.8247 13.4766 2.74822 13.432C2.67174 13.3874 2.60847 13.3233 2.56487 13.2463C2.52126 13.1693 2.49889 13.082 2.50004 12.9935C2.50119 12.905 2.52582 12.8184 2.5714 12.7425L6.50015 6.19625V2" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.25" d="M4.47656 9.56754C5.30344 9.41254 6.47656 9.47942 7.99969 10.25C10.0153 11.2707 11.4216 11.0569 12.2184 10.7282" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
            </svg>
        </div>
            실험 기능입니다. <u><a href="/docs/docs/beta-and-experimental-features#experimental-features">자세히 알아보세요.</a></u>
        </div>;
};

이 설정들은 [system.merge\_tree\_settings](/docs/ko/reference/system-tables/merge_tree_settings)에서 확인할 수 있으며, ClickHouse 소스 코드에서 자동 생성됩니다.

<div id="adaptive_write_buffer_initial_size">
  ## adaptive\_write\_buffer\_initial\_size
</div>

<SettingsInfoBlock type="NonZeroUInt64" default_value="16384" />

적응형 쓰기 버퍼의 초기 크기입니다.

<div id="add_implicit_sign_column_constraint_for_collapsing_engine">
  ## add\_implicit\_sign\_column\_constraint\_for\_collapsing\_engine
</div>

<SettingsInfoBlock type="Bool" default_value="0" />

true로 설정하면 CollapsingMergeTree 또는 VersionedCollapsingMergeTree 테이블의 `sign` 컬럼에 암시적 제약 조건을 추가하여 유효한 값(`1` 및 `-1`)만 허용합니다.

<div id="alter_column_secondary_index_mode">
  ## alter\_column\_secondary\_index\_mode
</div>

<SettingsInfoBlock type="AlterColumnSecondaryIndexMode" default_value="rebuild" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.12"},{"label": "rebuild"},{"label": "종속된 보조 인덱스가 있는 경우 `column`에 대한 ALTER를 허용하도록 동작이 변경되었습니다"}]}]} />

보조 인덱스가 적용된 컬럼을 수정하는 `ALTER` 명령을 허용할지와,
허용하는 경우 어떤 작업을 수행할지를 구성합니다. 기본적으로 이러한 `ALTER` 명령은 허용되며 인덱스가 다시 빌드됩니다.

가능한 값:

* `rebuild` (기본값): `ALTER` 명령에서 해당 컬럼의 영향을 받는 모든 보조 인덱스를 다시 빌드합니다.
* `throw`: 예외를 발생시켜 **명시적** 보조 인덱스가 적용된 컬럼에 대한 모든 `ALTER`를 막습니다. 암시적 인덱스는 이 제한에서 제외되며 다시 빌드됩니다.
* `drop`: 종속된 보조 인덱스를 삭제합니다. 새 파트에는 해당 인덱스가 포함되지 않으므로, 다시 생성하려면 `MATERIALIZE INDEX`를 실행해야 합니다.
* `compatibility`: 원래 동작과 동일하게 맞춥니다. `ALTER ... MODIFY COLUMN`에는 `throw`를, `ALTER ... UPDATE/DELETE`에는 `rebuild`를 적용합니다.
* `ignore`: 전문가용 옵션입니다. 인덱스를 불일치한 상태로 남겨 두므로 잘못된 쿼리 결과가 발생할 수 있습니다.

<div id="apply_patches_on_merge">
  ## apply\_patches\_on\_merge
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.5"},{"label": "1"},{"label": "새로운 설정"}]}]} />

값이 true이면 머지 시 패치 파트가 적용됩니다

<div id="assign_part_uuids">
  ## assign\_part\_uuids
</div>

<SettingsInfoBlock type="Bool" default_value="0" />

활성화하면 새 part마다 고유한 part 식별자가 할당됩니다.
활성화하기 전에 모든 레플리카가 UUID 버전 4를 지원하는지 확인하십시오.

<div id="auto_statistics_types">
  ## auto\_statistics\_types
</div>

<SettingsInfoBlock type="String" default_value="basic, uniq_v2" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.7"},{"label": "basic, uniq_v2"},{"label": "기본 자동 통계에서 `minmax` 통계 타입을 `basic`(`minmax`의 상위 집합)으로 대체하고, 삽입 시 오버헤드와 메모리 사용량을 줄이기 위해 `uniq`도 `uniq_v2`로 대체합니다"}]}, {"id": "row-2","items": [{"label": "26.4"},{"label": "minmax, uniq"},{"label": "기본적으로 자동 통계를 활성화합니다"}]}, {"id": "row-3","items": [{"label": "25.10"},{"label": ""},{"label": "새로운 설정"}]}]} />

모든 적합한 컬럼에 대해 자동으로 계산할 통계 타입의 쉼표로 구분된 목록입니다.
지원되는 통계 타입: basic, tdigest, countmin, uniq, uniq\_v2.
`minmax` 통계 타입은 더 이상 권장되지 않습니다. `basic`의 부분 집합이므로 대신 `basic`을 사용해야 합니다.

<div id="background_task_preferred_step_execution_time_ms">
  ## background\_task\_preferred\_step\_execution\_time\_ms
</div>

<SettingsInfoBlock type="밀리초" default_value="50" />

머지 또는 mutation의 한 단계 실행에 대한 목표 시간입니다. 한 단계 실행 시간이 더 길면
이 값을 초과할 수 있습니다.

<div id="clean_deleted_rows">
  ## clean\_deleted\_rows
</div>

<SettingsInfoBlock type="CleanDeletedRows" default_value="Never" />

더 이상 사용되지 않는 설정이며, 아무 동작도 하지 않습니다.

<div id="clone_replica_zookeeper_create_get_part_batch_size">
  ## clone\_replica\_zookeeper\_create\_get\_part\_batch\_size
</div>

<SettingsInfoBlock type="NonZeroUInt64" default_value="100" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.2"},{"label": "100"},{"label": "새로운 설정"}]}]} />

레플리카를 복제할 때 ZooKeeper multi-create get-part 요청에 사용하는 Batch 크기입니다.

<div id="compatibility_allow_sampling_expression_not_in_primary_key">
  ## compatibility\_allow\_sampling\_expression\_not\_in\_primary\_key
</div>

<SettingsInfoBlock type="Bool" default_value="0" />

프라이머리 키에 샘플링 표현식이 없는 테이블을 생성할 수 있도록 허용합니다. 이는
이전 버전과의 호환성을 위해 잘못된 테이블이 있는 서버를 일시적으로 실행해야 할 때에만
필요합니다.

<div id="compute_exact_num_defaults_for_sparse_columns">
  ## compute\_exact\_num\_defaults\_for\_sparse\_columns
</div>

<ExperimentalBadge />

<SettingsInfoBlock type="Bool" default_value="0" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.7"},{"label": "0"},{"label": "희소성 기반 프루닝과 trivial-count 재작성을 위해 컬럼별 정확한 num_defaults 계산을 제어하는 새로운 설정"}]}]} />

희소 직렬화 여부를 결정할 때 사용하는 비용이 더 적은 샘플링 추정치 대신,
삽입 및 머지 중에 컬럼별 기본값의 정확한 개수를 계산합니다.
이 설정은 저장된 `num_defaults` 카운터를 사용하는
`optimize_trivial_count_with_sparsity_filter`에 필요합니다(널 허용 컬럼은
추가로 `nullable_serialization_version = 'allow_sparse'`가 필요합니다).
비활성화된 상태로 두면 삽입/머지 속도는 이전과 동일하게 유지되며, 활성화하면
희소 직렬화가 가능한 각 컬럼마다 O(rows) 패스가 추가됩니다.

<div id="deduplicate_merge_projection_mode">
  ## deduplicate\_merge\_projection\_mode
</div>

<SettingsInfoBlock type="DeduplicateMergeProjectionMode" default_value="throw" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "24.8"},{"label": "throw"},{"label": "일관되지 않은 프로젝션의 생성을 허용하지 않습니다"}]}]} />

(Replicated, Shared) MergeTree가 아닌 비클래식 MergeTree를 사용하는
테이블에서 프로젝션 생성을 허용할지 지정합니다. `ignore` 옵션은 순전히
compatibility를 위한 것이며, 잘못된 결과를 초래할 수 있습니다. 허용하는 경우에는
프로젝션을 머지할 때 수행할 동작을 지정하며, `drop` 또는 `rebuild` 중
하나를 선택합니다. 따라서 클래식 MergeTree에서는 이 설정이 무시됩니다.
또한 `OPTIMIZE DEDUPLICATE`도 제어하지만, 모든 MergeTree 엔진 계열
구성원에 영향을 미칩니다. `lightweight_mutation_projection_mode` 옵션과
마찬가지로, 이것도 part 수준입니다.

가능한 값:

* `ignore`
* `throw`
* `drop`
* `rebuild`

<div id="deduplication_hashes_cache_update_wait_ms">
  ## deduplication\_hashes\_cache\_update\_wait\_ms
</div>

<SettingsInfoBlock type="Milliseconds" default_value="100" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.7"},{"label": "100"},{"label": "새 설정입니다. `async_block_ids_cache_update_wait_ms`를 올바르게 이름 붙인 대체 설정이며, 통합 `deduplication_hashes` 캐시가 갱신될 때까지 삽입이 얼마나 오래 대기할지 제어합니다."}]}]} />

각 삽입 반복에서 인메모리 `deduplication_hashes` 캐시가 더 최신 버전으로 갱신될 때까지
대기한 뒤, 이미 삽입된 블록이 있는지 다시 확인하는 시간을 지정합니다. 이 캐시는
ClickHouse Keeper의 `deduplication_hashes` 디렉터리를 미러링하므로, 삽입 시
Keeper와 왕복 통신하지 않고도 중복을 감지할 수 있습니다.

<div id="default_compression_codec">
  ## default\_compression\_codec
</div>

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.4"},{"label": ""},{"label": "새로운 설정"}]}]} />

테이블 선언에서 특정 컬럼에 압축 코덱이 정의되어 있지 않은 경우 사용할 기본 압축 코덱을 지정합니다.
컬럼의 압축 코덱 선택 순서는 다음과 같습니다.

1. 테이블 선언에서 해당 컬럼에 정의된 압축 코덱
2. `default_compression_codec`에 정의된 압축 코덱(이 설정)
3. `compression` 설정에 정의된 기본 압축 코덱
   기본값: 빈 문자열(정의되지 않음)입니다.

<div id="disk">
  ## 디스크
</div>

스토리지 디스크의 이름입니다. 스토리지 정책 대신 지정할 수도 있습니다.

<div id="dynamic_serialization_version">
  ## dynamic\_serialization\_version
</div>

<SettingsInfoBlock type="MergeTreeDynamicSerializationVersion" default_value="v3" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.8"},{"label": "v2"},{"label": "Dynamic 직렬화 버전을 제어하는 설정 추가"}]}, {"id": "row-2","items": [{"label": "25.12"},{"label": "v3"},{"label": "더 나은 직렬화/역직렬화를 위해 Dynamic에 기본적으로 v3 직렬화 버전 활성화"}]}]} />

Dynamic 데이터 타입의 직렬화 버전입니다. compatibility를 위해 필요합니다.

가능한 값:

* `v1`
* `v2`
* `v3`

<div id="enforce_index_structure_match_on_partition_manipulation">
  ## enforce\_index\_structure\_match\_on\_partition\_manipulation
</div>

<SettingsInfoBlock type="Bool" default_value="0" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "24.12"},{"label": "0"},{"label": "새로운 설정"}]}]} />

파티션 조작
쿼리(`ATTACH/MOVE/REPLACE PARTITION`)의 대상 테이블에서 이 설정을 활성화하면, 원본 테이블과 대상 테이블의 인덱스와 프로젝션이
서로 동일해야 합니다. 그렇지 않으면 대상
테이블은 원본 테이블의 인덱스와 프로젝션을 모두 포함하는 상위 집합이어도 됩니다.

<div id="execute_merges_on_single_replica_time_threshold">
  ## execute\_merges\_on\_single\_replica\_time\_threshold
</div>

<SettingsInfoBlock type="Seconds" default_value="0" />

이 설정값이 0보다 크면 하나의 레플리카만 즉시 머지를 시작하고, 다른 레플리카는 로컬에서 머지를 수행하는 대신 해당 시간 동안 결과를 다운로드하기 위해 대기합니다. 선택된 레플리카가 그 시간 안에 머지를 완료하지 못하면 표준 동작으로 폴백합니다.

Possible values:

* 양의 정수 아무 값이나 가능합니다.

<div id="finished_mutations_to_keep">
  ## finished\_mutations\_to\_keep
</div>

<SettingsInfoBlock type="UInt64" default_value="100" />

완료된 뮤테이션에 대한 레코드를 몇 개까지 유지할지 지정합니다. 0이면
모두 유지합니다.

<div id="force_read_through_cache_for_merges">
  ## force\_read\_through\_cache\_for\_merges
</div>

<ExperimentalBadge />

<SettingsInfoBlock type="Bool" default_value="0" />

머지 시 파일 시스템 캐시를 통한 읽기를 강제합니다

<div id="initialization_retry_period">
  ## initialization\_retry\_period
</div>

<SettingsInfoBlock type="Seconds" default_value="60" />

테이블 초기화를 재시도하는 주기이며, 단위는 초입니다.

<div id="kill_threads">
  ## kill\_threads
</div>

<SettingsInfoBlock type="UInt64" default_value="128" />

더 이상 사용되지 않는 설정이며, 아무런 효과가 없습니다.

<div id="lightweight_mutation_projection_mode">
  ## lightweight\_mutation\_projection\_mode
</div>

<SettingsInfoBlock type="LightweightMutationProjectionMode" default_value="throw" />

기본적으로 경량한 삭제 `DELETE`는 프로젝션이 있는 테이블에서는 작동하지 않습니다. 이는 프로젝션의 행이 `DELETE` 작업의 영향을 받을 수 있기 때문입니다. 따라서 기본값은 `throw`입니다. 하지만 이 옵션을 사용하면 동작 방식을 변경할 수 있습니다. 값이 `drop` 또는 `rebuild`이면 프로젝션이 있는 테이블에서도 삭제가 작동합니다. `drop`은 프로젝션을 삭제하므로 현재 쿼리에서는 프로젝션이 제거되어 더 빠를 수 있지만, 이후 쿼리에서는 attached 상태인 프로젝션이 없어 더 느려질 수 있습니다. `rebuild`는 프로젝션을 다시 빌드하므로 현재 쿼리의 성능에 영향을 줄 수 있지만, 이후 쿼리 속도는 빨라질 수 있습니다. 또한 이러한 옵션은 part 수준에서만 작동합니다. 즉, 영향을 받지 않은 part의 프로젝션은 삭제나 재빌드 같은 작업을 유발하지 않고 그대로 유지됩니다.

가능한 값:

* `throw`
* `drop`
* `rebuild`

<div id="load_existing_rows_count_for_old_parts">
  ## load\_existing\_rows\_count\_for\_old\_parts
</div>

<SettingsInfoBlock type="Bool" default_value="0" />

[exclude\_deleted\_rows\_for\_part\_size\_in\_merge](/docs/ko/reference/settings/merge-tree-settings/exclude#exclude_deleted_rows_for_part_size_in_merge)와 함께 활성화하면,
기존 데이터 파트의 삭제된 행 수를 테이블 시작 과정에서 계산합니다. 이로 인해
시작 시 테이블 로딩이 느려질 수 있습니다.

가능한 값:

* `true`
* `false`

**관련 항목**

* [exclude\_deleted\_rows\_for\_part\_size\_in\_merge](/docs/ko/reference/settings/merge-tree-settings/exclude#exclude_deleted_rows_for_part_size_in_merge) 설정

<div id="lock_acquire_timeout_for_background_operations">
  ## lock\_acquire\_timeout\_for\_background\_operations
</div>

<SettingsInfoBlock type="Seconds" default_value="120" />

머지, 뮤테이션 등의 백그라운드 작업에서 테이블 잠금을 획득하지 못한 상태로 실패 처리되기까지의 시간(초)입니다.

<div id="mutation_workload">
  ## mutation\_workload
</div>

뮤테이션과 다른 워크로드 간에 리소스를 어떻게 사용하고 공유할지 조절하는 데 사용됩니다. 지정한 값은 이 테이블의 백그라운드 뮤테이션에 대한 `workload` 설정 값으로 사용됩니다. 지정하지 않으면(빈 문자열) 서버 설정 `mutation_workload`가 대신 사용됩니다.

**관련 항목**

* [워크로드 스케줄링](/docs/ko/concepts/features/configuration/server-config/workload-scheduling)

<div id="non_replicated_deduplication_window">
  ## non\_replicated\_deduplication\_window
</div>

<SettingsInfoBlock type="UInt64" default_value="0" />

중복 여부를 확인하기 위해 해시 합을 저장하는, 비복제
[MergeTree](/docs/ko/reference/engines/table-engines/mergetree-family/mergetree) 테이블에서
가장 최근에 삽입된 블록의 수입니다.

Possible values:

* 임의의 양의 정수
* `0` (중복 제거 비활성화)

복제된 테이블(자세한 내용은
[replicated\_deduplication\_window](/docs/ko/reference/settings/merge-tree-settings/replicated-deduplication-window#replicated_deduplication_window) 설정 참조)과 유사한 중복 제거 메커니즘을 사용합니다.
중복 제거 해시 합은 삽입된 블록 전체를 포함합니다. 해시 합은
ClickHouse Keeper가 아니라 디스크의 로컬 파일에 기록됩니다.

<div id="notify_newest_block_number">
  ## notify\_newest\_block\_number
</div>

<ExperimentalBadge />

<SettingsInfoBlock type="Bool" default_value="0" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.1"},{"label": "0"},{"label": "Cloud sync"}]}]} />

최신 block 번호를 SharedJoin 또는 SharedSet에 전달합니다. ClickHouse Cloud에서만 지원됩니다.

<div id="nullable_serialization_version">
  ## nullable\_serialization\_version
</div>

<SettingsInfoBlock type="MergeTreeNullableSerializationVersion" default_value="basic" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.12"},{"label": "basic"},{"label": "새로운 설정"}]}]} />

`Nullable(T)` 컬럼에 사용되는 직렬화 메서드를 제어합니다.

가능한 값:

* basic — `Nullable(T)`에 표준 직렬화를 사용합니다.

* allow\_sparse — `Nullable(T)`에서 희소 인코딩을 사용할 수 있도록 허용합니다.

<div id="object_serialization_version">
  ## object\_serialization\_version
</div>

<SettingsInfoBlock type="MergeTreeObjectSerializationVersion" default_value="v3" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.8"},{"label": "v2"},{"label": "JSON 직렬화 버전을 제어하는 설정 추가"}]}, {"id": "row-2","items": [{"label": "25.12"},{"label": "v3"},{"label": "고급 shared data 직렬화 버전을 사용하기 위해 기본적으로 JSON에 v3 직렬화 버전 활성화"}]}]} />

JSON 데이터 타입의 직렬화 버전입니다. compatibility를 위해 필요합니다.

가능한 값:

* `v1`
* `v2`
* `v3`

shared data 직렬화 버전을 변경할 수 있는 버전은 `v3`뿐입니다.

<div id="old_parts_lifetime">
  ## old\_parts\_lifetime
</div>

<SettingsInfoBlock type="Seconds" default_value="480" />

예기치 않은 server 재부팅 시 데이터 손실을 방지하기 위해
비활성 파트를 보관하는 시간(초)입니다.

Possible values:

* 임의의 양의 정수.

여러 파트를 새 파트로 머지한 후 ClickHouse는 원래
파트를 비활성으로 표시하고, `old_parts_lifetime`초가 지난 후에만 삭제합니다.
비활성 파트는 현재 쿼리에서 사용되지 않는 경우, 즉
파트의 `refcount`가 1인 경우 제거됩니다.

새 파트에는 `fsync`가 호출되지 않으므로 일정 시간 동안 새 파트는
server의 RAM(OS cache)에만 존재합니다. server가 예기치 않게 재부팅되면 새
파트가 손실되거나 손상될 수 있습니다. 데이터를 보호하기 위해 비활성 파트는 즉시 삭제되지
않습니다.

시작 시 ClickHouse는 파트의 무결성을 검사합니다. 병합된
파트가 손상된 경우 ClickHouse는 비활성 파트를 active 목록으로 되돌린 뒤
나중에 다시 머지합니다. 그런 다음 손상된 파트의 이름이 변경되고(`broken_`
접두사가 추가됨) `detached` 폴더로 이동됩니다. 병합된 파트가
손상되지 않은 경우에는 원래 비활성 파트의 이름이 변경되고(`ignored_`
접두사가 추가됨) `detached` 폴더로 이동됩니다.

기본 `dirty_expire_centisecs` 값(Linux 커널 설정)은 30
초(RAM에만 기록된 데이터가 저장되는 최대 시간)이지만,
디스크 시스템에 부하가 큰 경우 데이터는 훨씬 나중에 기록될 수 있습니다. 실험적으로
`old_parts_lifetime` 값은 480초로 선택되었으며, 이 시간 동안에는
새 파트가 디스크에 기록되는 것이 보장됩니다.

<div id="optimize_row_order">
  ## optimize\_row\_order
</div>

<SettingsInfoBlock type="Bool" default_value="0" />

새로 삽입되는 테이블 파트의 압축 효율을 높이기 위해, 삽입 중 행 순서를 최적화할지 제어합니다.

일반적인 MergeTree 엔진 테이블에서만 효과가 있습니다. 특수한 MergeTree 엔진 테이블(예: CollapsingMergeTree)에는 적용되지 않습니다.

MergeTree 테이블은 [압축 코덱](/docs/ko/reference/statements/create/table#column_compression_codec)을 사용해 (선택적으로) 압축됩니다.
LZ4 및 ZSTD와 같은 범용 압축 코덱은 데이터에 패턴이 있을 때 최대 압축률을 달성합니다.
같은 값이 길게 반복되는 구간은 일반적으로 매우 잘 압축됩니다.

이 설정을 활성화하면 ClickHouse는 새로 삽입된 파트의 데이터를, 새 테이블 파트의 여러 컬럼에 걸쳐 동일한 값이 연속으로 반복되는 구간 수를 최소화하는 행 순서로 저장하려고 시도합니다.
즉, 동일한 값의 반복 구간 수가 적을수록 각 구간은 길어지고 압축도 더 잘됩니다.

최적의 행 순서를 찾는 일은 계산적으로 실현 가능하지 않습니다(NP-hard).
따라서 ClickHouse는 원래 행 순서보다 압축률을 개선할 수 있는 행 순서를 빠르게 찾기 위해 휴리스틱을 사용합니다.

<details markdown="1">
  <summary>행 순서를 찾기 위한 휴리스틱</summary>

  일반적으로 SQL에서는 행 순서만 다른 동일한 테이블(또는 테이블 파트)을 동등한 것으로 간주하므로, 테이블(또는 테이블 파트)의 행은 자유롭게 섞을 수 있습니다.

  하지만 테이블에 기본 키(primary key)가 정의되어 있으면 이러한 자유는 제한됩니다.
  ClickHouse에서 기본 키 `C1, C2, ..., CN`는 테이블 행이 컬럼 `C1`, `C2`, ... `Cn`을 기준으로 정렬되도록 강제합니다([clustered index](https://en.wikipedia.org/wiki/Database_index#Clustered)).
  그 결과 행은 "동치 클래스" 안에서만 섞을 수 있습니다.
  즉, 기본 키 컬럼의 값이 같은 행들끼리만 재배치할 수 있습니다.
  직관적으로, high-cardinality 기본 키(예: `DateTime64` timestamp 컬럼을 포함하는 기본 키)는 작은 동치 클래스를 많이 만듭니다.
  반대로 low-cardinality 기본 키를 가진 테이블은 적은 수의 큰 동치 클래스를 만듭니다.
  기본 키가 없는 테이블은 모든 행을 포괄하는 하나의 동치 클래스만 있는 극단적인 경우에 해당합니다.

  동치 클래스의 수가 적고 크기가 클수록 행을 다시 섞을 수 있는 자유도는 높아집니다.

  각 동치 클래스 내에서 최적의 행 순서를 찾기 위해 적용되는 휴리스틱은 D. Lemire, O. Kaser의
  [Reordering columns for smaller indexes](https://doi.org/10.1016/j.ins.2011.02.002)에서 제안되었으며,
  각 동치 클래스 내의 행을 기본 키가 아닌 컬럼의 cardinality 오름차순으로 정렬하는 방식에 기반합니다.

  이 과정은 3단계로 이루어집니다:

  1. 기본 키 컬럼의 행 값을 기준으로 모든 동치 클래스를 찾습니다.
  2. 각 동치 클래스에 대해 기본 키가 아닌 컬럼의 cardinality를 계산합니다(일반적으로는 추정).
  3. 각 동치 클래스에 대해 기본 키가 아닌 컬럼의 cardinality 오름차순으로 행을 정렬합니다.
</details>

활성화하면 새 데이터의 행 순서를 분석하고 최적화하기 위한 추가 CPU 비용이 삽입 작업에 발생합니다.
데이터 특성에 따라 INSERT는 30-50% 더 오래 걸릴 수 있습니다.
LZ4 또는 ZSTD의 압축률은 평균적으로 20-40% 향상됩니다.

이 설정은 기본 키가 없거나 low-cardinality 기본 키를 가진 테이블, 즉 서로 다른 기본 키 값이 적은 테이블에서 가장 효과적입니다.
예를 들어 `DateTime64` 타입의 timestamp 컬럼을 포함하는 high-cardinality 기본 키는 이 설정의 효과를 보기 어렵습니다.

<div id="packed_skip_index_max_bytes">
  ## packed\_skip\_index\_max\_bytes
</div>

<ExperimentalBadge />

<SettingsInfoBlock type="UInt64" default_value="0" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.6"},{"label": "0"},{"label": "새 설정입니다. 직렬화된 온디스크 크기가 이 바이트 수 이하인 skip-index 서브스트림은 각 파트별로 단일 `skp_idx.packed` 아카이브에 패킹됩니다. 더 큰 서브스트림은 기존의 독립형 `skp_idx_<name>.idx2` \/ `.mrk2` 레이아웃을 유지합니다. 이 결정은 쓰기 시점에 서브스트림별로 내려집니다."}]}]} />

이 임계값(직렬화된 온디스크 바이트 수, 즉 서브스트림의 압축과 해시 체인 이후 크기)보다
작은 skip-index 서브스트림은 별도의 `skp_idx_<name>.idx2` / `.mrk2` 파일로
기록되지 않고, 각 파트별 단일 `skp_idx.packed` 아카이브로 묶입니다. 이보다 큰
서브스트림은 기존 파일별 레이아웃을 유지합니다. 이 결정은 쓰기 시점에 서브스트림별로
독립적으로 이루어지므로, 하나의 파트 안에서도 작은 인덱스(예: `minmax`)는 패킹되고
큰 인덱스(예: 규모가 큰 `bloom_filter`)는 파일별로 저장될 수 있습니다. 패킹을 완전히
비활성화하려면 0으로 설정합니다(기본값).

각 skip-index 서브스트림은 실제로 데이터 파일과 마크 파일로 구성되며, spill 여부를
결정하기 전까지 두 파일 모두 메모리에서 임계값까지 버퍼링됩니다. 따라서 쓰기 중 최대
메모리 사용량은 `2 * packed_skip_index_max_bytes * (number of substreams that stay
below the threshold)`에 비례합니다.

전체 텍스트 인덱스는 이 설정에서 지원되지 않으며 패킹되지 않습니다.

패킹을 사용하면 테이블에 많은 skip 인덱스가 정의된 경우 inode 부담을 줄일 수 있습니다(예:
`add_minmax_index_for_numeric_columns` 사용 시).

온디스크 포맷은 자체 기술형입니다. 리더는 `skp_idx.packed`를 감지하고 그 안의 패킹된
서브스트림을 투명하게 처리합니다. 이 설정을 변경해도 새로 기록되는 파트에만 영향을 미치며,
기존 파트는 쓰기 시점의 레이아웃을 그대로 유지합니다.

<div id="part_minmax_index_columns">
  ## part\_minmax\_index\_columns
</div>

<SettingsInfoBlock type="MergeTreePartMinMaxIndexColumns" default_value="partition_key_only" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.5"},{"label": "partition_key_only"},{"label": "새 설정입니다."}]}]} />

파트별 min-max 인덱스에 포함할 컬럼을 선택합니다. 각 값은 이전 값에 더해 추가 컬럼 그룹을 활성화합니다.

가능한 값:

* `partition_key_only` — 파티션 키 컬럼만 추적합니다.
* `with_block_number_offset` — 파티션 키 컬럼에 더해 영속적으로 저장된 `_block_number` 및 `_block_offset` 가상 컬럼도 추적합니다. 이 컬럼을 기준으로 파트 수준 프루닝을 사용할 수 있습니다.

<div id="propagate_types_serialization_versions_to_nested_types">
  ## propagate\_types\_serialization\_versions\_to\_nested\_types
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.3"},{"label": "1"},{"label": "기본적으로 데이터 타입 직렬화 버전을 중첩 타입에 전파합니다"}]}]} />

true인 경우, string\_serialization\_version과 같은 직렬화 버전이 Array/Map/Nullable/JSON/etc.와 같은 중첩 타입 내부로 전파됩니다. 비활성화하면 직렬화 버전은 이 타입의 최상위 컬럼과 Tuple el에만 적용됩니다

<div id="ratio_of_defaults_for_sparse_serialization">
  ## ratio\_of\_defaults\_for\_sparse\_serialization
</div>

<SettingsInfoBlock type="Float" default_value="0.9375" />

컬럼에서 *기본* 값의 개수를 *전체* 값의 개수로 나눈 최소 비율입니다.
이 값을 설정하면 컬럼이 희소 직렬화를 사용하여 저장됩니다.

컬럼이 희소한 경우(대부분의 값이 0인 경우), ClickHouse는 이를
희소 포맷으로 인코딩하여 계산을 자동으로 최적화할 수 있습니다. 즉, 쿼리 중에
데이터를 완전히 압축 해제할 필요가 없습니다. 이 희소
직렬화를 활성화하려면 `ratio_of_defaults_for_sparse_serialization`
설정을 1.0보다 작게 지정하십시오. 값이 1.0 이상이면
컬럼은 항상 일반적인 전체 serialization을 사용하여 기록됩니다.

가능한 값:

* 희소 직렬화를 활성화하려면 `0`과 `1` 사이의 Float 값
* 희소 직렬화를 사용하지 않으려면 `1.0`(또는 그 이상)

**예시**

다음 테이블에서는 `s` 컬럼의 값이
전체 행의 95%에서 빈 문자열입니다. `my_regular_table`에서는 희소 직렬화를 사용하지 않고,
`my_sparse_table`에서는 `ratio_of_defaults_for_sparse_serialization`을
0.95로 설정합니다:

```sql theme={null}
CREATE TABLE my_regular_table
(
`id` UInt64,
`s` String
)
ENGINE = MergeTree
ORDER BY id;

INSERT INTO my_regular_table
SELECT
number AS id,
number % 20 = 0 ? toString(number): '' AS s
FROM
numbers(10000000);

CREATE TABLE my_sparse_table
(
`id` UInt64,
`s` String
)
ENGINE = MergeTree
ORDER BY id
SETTINGS ratio_of_defaults_for_sparse_serialization = 0.95;

INSERT INTO my_sparse_table
SELECT
number,
number % 20 = 0 ? toString(number): ''
FROM
numbers(10000000);
```

`my_sparse_table`의 `s` 컬럼이 디스크에서 차지하는 저장 공간이 더 적다는 점을 확인하십시오:

```sql theme={null}
SELECT table, name, data_compressed_bytes, data_uncompressed_bytes FROM system.columns
WHERE table LIKE 'my_%_table';
```

```response theme={null}
┌─table────────────┬─name─┬─data_compressed_bytes─┬─data_uncompressed_bytes─┐
│ my_regular_table │ id   │              37790741 │                75488328 │
│ my_regular_table │ s    │               2451377 │                12683106 │
│ my_sparse_table  │ id   │              37790741 │                75488328 │
│ my_sparse_table  │ s    │               2283454 │                 9855751 │
└──────────────────┴──────┴───────────────────────┴─────────────────────────┘
```

컬럼이 희소 인코딩을 사용하는지 여부는 `system.parts_columns` 테이블의
`serialization_kind` 컬럼을 확인하여 검증할 수 있습니다:

```sql theme={null}
SELECT column, serialization_kind FROM system.parts_columns
WHERE table LIKE 'my_sparse_table';
```

`s`에서 어느 부분이 희소 직렬화로 저장되었는지 확인할 수 있습니다:

```response theme={null}
┌─column─┬─serialization_kind─┐
│ id     │ Default            │
│ s      │ Default            │
│ id     │ Default            │
│ s      │ Default            │
│ id     │ Default            │
│ s      │ Sparse             │
│ id     │ Default            │
│ s      │ Sparse             │
│ id     │ Default            │
│ s      │ Sparse             │
│ id     │ Default            │
│ s      │ Sparse             │
│ id     │ Default            │
│ s      │ Sparse             │
│ id     │ Default            │
│ s      │ Sparse             │
│ id     │ Default            │
│ s      │ Sparse             │
│ id     │ Default            │
│ s      │ Sparse             │
│ id     │ Default            │
│ s      │ Sparse             │
└────────┴────────────────────┘
```

<div id="reduce_blocking_parts_sleep_ms">
  ## reduce\_blocking\_parts\_sleep\_ms
</div>

<SettingsInfoBlock type="UInt64" default_value="5000" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.1"},{"label": "5000"},{"label": "Cloud sync"}]}]} />

ClickHouse Cloud에서만 사용할 수 있습니다. 범위가 삭제되거나 대체되지 않은 경우,
다시 blocking 파트를 줄이기 전에 대기하는 최소 시간입니다. 이 설정값을 낮추면
background\_schedule\_pool의 작업이 더 자주 트리거되어 대규모 클러스터에서
ZooKeeper로 많은 요청이 발생합니다.

<div id="replace_long_file_name_to_hash">
  ## replace\_long\_file\_name\_to\_hash
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

컬럼의 파일 이름이 너무 길면('max\_file\_name\_length'
바이트 초과) SipHash128로 대체됩니다

<div id="replicated_can_become_leader">
  ## replicated\_can\_become\_leader
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

`true`이면 이 노드의 복제된 테이블 레플리카가
리더 역할을 맡으려고 시도합니다.

가능한 값:

* `true`
* `false`

<div id="search_orphaned_parts_disks">
  ## search\_orphaned\_parts\_disks
</div>

<SettingsInfoBlock type="SearchOrphanedPartsDisks" default_value="any" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.8"},{"label": "any"},{"label": "새로운 설정"}]}]} />

ClickHouse는 정책에 포함되지 않은 정의되지 않은 디스크의 데이터 파트를 누락하지 않도록, ATTACH 또는 CREATE table 시마다 모든 디스크에서 고아 파트를 스캔합니다.
고아 파트는 잠재적으로 안전하지 않은 스토리지 재구성으로 인해 발생하며, 예를 들어 디스크가 스토리지 정책에서 제외된 경우에 생길 수 있습니다.
이 설정은 디스크의 특성에 따라 검색할 디스크 범위를 제한합니다.

가능한 값:

* any - 범위가 제한되지 않습니다.
* local - 범위가 로컬 디스크로 제한됩니다.
* none - 범위가 비어 있으며, 검색하지 않습니다

<div id="serialization_info_version">
  ## serialization\_info\_version
</div>

<SettingsInfoBlock type="MergeTreeSerializationInfoVersion" default_value="with_types" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.11"},{"label": "with_types"},{"label": "사용자 지정 문자열 serialization을 지원하는 최신 포맷으로 변경"}]}, {"id": "row-2","items": [{"label": "25.10"},{"label": "basic"},{"label": "새로운 설정"}]}]} />

`serialization.json`을 작성할 때 사용하는 serialization info version입니다.
이 설정은 cluster upgrade 중 compatibility를 유지하는 데 필요합니다.

가능한 값:

* `basic` - 기본 포맷입니다.
* `with_types` - 추가 `types_serialization_versions` 필드가 포함된 포맷이며, 타입별 직렬화 버전을 사용할 수 있습니다.
  이렇게 하면 `string_serialization_version`과 같은 설정이 적용됩니다.

rolling upgrade 중에는 새 server가 기존 server와 호환되는
data part를 생성하도록 이 값을 `basic`으로 설정하십시오. upgrade가 완료되면
타입별 직렬화 버전을 활성화하려면 `WITH_TYPES`로 전환하십시오.

<div id="share_nested_offsets">
  ## share\_nested\_offsets
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.4"},{"label": "1"},{"label": "false로 설정하면 공통 접두사를 가진 점 표기 이름의 Array 컬럼은 legacy Nested 시맨틱에 따라 offset 파일을 공유하지 않고 서로 독립적인 컬럼으로 처리됩니다"}]}]} />

활성화된 경우(기본값), 공통 접두사를 가진 점 표기 이름의 Array 컬럼(예: n.a 및 n.b)은
Nested 구조의 일부로 처리됩니다. 즉, 디스크에서 하나의 offsets 파일(예: n.size0)을 공유하며,
INSERT 중에는 배열 크기가 서로 같은지 검증합니다.
비활성화된 경우 각 Array 컬럼은 자체적인 독립 offset 파일을 가지며, 점 표기 이름은 더 이상 특별한
시맨틱을 갖지 않습니다. 또한 동일한 접두사를 공유하는 점 표기 Array 컬럼과 스칼라 컬럼이 함께 존재할 수 있습니다
(예: n UInt32와 n.a Array(String)). 이 설정은 테이블 생성 후에는 변경할 수 없습니다.

<div id="simultaneous_parts_removal_limit">
  ## simultaneous\_parts\_removal\_limit
</div>

<SettingsInfoBlock type="UInt64" default_value="0" />

오래된 파트가 많으면 정리 스레드가 한 번의 반복에서 최대
`simultaneous_parts_removal_limit`개의 파트를 삭제합니다.
`simultaneous_parts_removal_limit`를 `0`으로 설정하면 제한 없이 삭제합니다.

<div id="storage_policy">
  ## storage\_policy
</div>

<SettingsInfoBlock type="String" default_value="default" />

스토리지 디스크 정책 이름

<div id="string_serialization_version">
  ## string\_serialization\_version
</div>

<SettingsInfoBlock type="MergeTreeStringSerializationVersion" default_value="with_size_stream" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.11"},{"label": "with_size_stream"},{"label": "별도 크기 정보를 사용하는 최신 포맷으로 변경"}]}, {"id": "row-2","items": [{"label": "25.10"},{"label": "single_stream"},{"label": "새로운 설정"}]}]} />

최상위 `String` 컬럼의 직렬화 포맷을 제어합니다.

이 설정은 `serialization_info_version`이 "with\_types"로 설정된 경우에만 적용됩니다.
`with_size_stream`으로 설정하면 최상위 `String` 컬럼은 문자열 길이를 저장하는 별도의
`.size` 서브컬럼을 사용해 직렬화되며, 인라인으로 저장되지 않습니다. 이렇게 하면 실제 `.size`
서브컬럼을 사용할 수 있고 압축 효율도 향상될 수 있습니다.

중첩된 `String` 타입(예: `Nullable`, `LowCardinality`, `Array`, `Map` 내부)은
`Tuple` 안에 있는 경우를 제외하면 영향을 받지 않습니다.

가능한 값:

* `single_stream` — 크기 정보를 인라인으로 저장하는 표준 직렬화 포맷을 사용합니다.
* `with_size_stream` — 최상위 `String` 컬럼에 별도의 크기 스트림을 사용합니다.

<div id="temporary_directories_lifetime">
  ## temporary\_directories\_lifetime
</div>

<SettingsInfoBlock type="Seconds" default_value="86400" />

tmp\_-directories를 유지하는 기간(초)입니다. 이 값을 낮추지 마십시오.
이 설정값이 너무 낮으면 머지와 뮤테이션이 제대로 작동하지 못할 수
있습니다.

<div id="try_fetch_recompressed_part_timeout">
  ## try\_fetch\_recompressed\_part\_timeout
</div>

<SettingsInfoBlock type="Seconds" default_value="7200" />

재압축을 동반한 머지를 시작하기 전에 대기하는 타임아웃(초)입니다. 이
시간 동안 ClickHouse는 이 재압축 머지가 할당된 레플리카에서 재압축된
파트를 가져오려고 시도합니다.

대부분의 경우 재압축은 느리므로, 이 타임아웃이 지나기 전에는 재압축을
동반한 머지를 시작하지 않고, 대신 이 재압축 머지가 할당된 레플리카에서
재압축된 파트를 가져오려고 시도합니다.

가능한 값:

* 임의의 양의 정수.

<div id="ttl_only_drop_parts">
  ## ttl\_only\_drop\_parts
</div>

<SettingsInfoBlock type="Bool" default_value="0" />

해당 파트의 모든 행이 `TTL` 설정에 따라 만료되었을 때, MergeTree 테이블에서 데이터 파트 전체를 삭제할지 제어합니다.

`ttl_only_drop_parts`가 비활성화된 경우(기본값), `TTL` 설정에 따라 만료된 행만 삭제됩니다.

`ttl_only_drop_parts`가 활성화된 경우, 해당 파트의 모든 행이 `TTL` 설정에 따라 만료되면 파트 전체가 삭제됩니다.

<div id="wait_for_unique_parts_send_before_shutdown_ms">
  ## wait\_for\_unique\_parts\_send\_before\_shutdown\_ms
</div>

<SettingsInfoBlock type="Milliseconds" default_value="0" />

테이블은 종료되기 전에 현재 레플리카에만 존재하는 고유 파트를 다른 레플리카가 가져갈 수 있도록 지정된 시간 동안 대기합니다(0은 비활성화를 의미합니다).

<div id="zookeeper_session_expiration_check_period">
  ## zookeeper\_session\_expiration\_check\_period
</div>

<SettingsInfoBlock type="Seconds" default_value="60" />

ZooKeeper 세션 만료 확인 주기입니다. 단위는 초입니다.

가능한 값:

* 양의 정수 아무 값이나 가능합니다.
