> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-detect-table-modification.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# optimize_trivial_* 세션 설정

> optimize_trivial_*로 생성된 그룹의 ClickHouse 세션 설정입니다.

export const BetaBadge = ({link, galaxyTrack, galaxyEvent}) => {
  if (link) {
    return <a href={link} target="_blank" rel="noopener noreferrer" className="betaBadge" onClick={galaxyTrack && galaxyEvent ? galaxyOnClick(galaxyEvent) : undefined}>
                <span>베타</span>
            </a>;
  }
  return <a href="https://clickhouse.com/docs/reference/settings/beta-and-experimental-features#beta-features" className="betaBadge">
            <span>베타 기능</span>
        </a>;
};

export const VersionHistory = ({rows = []}) => {
  if (rows.length === 0) {
    return null;
  }
  const headers = ["버전", "기본값", "설명"];
  const border = "1px solid rgba(128, 128, 128, 0.3)";
  const cell = {
    border,
    padding: "0.25rem 0.5rem",
    textAlign: "start",
    verticalAlign: "top"
  };
  return <details className="not-prose" style={{
    border,
    borderRadius: "0.5rem",
    margin: "0.5rem 0",
    padding: "0.5rem 0.75rem",
    fontSize: "0.8125rem",
    lineHeight: "1.125rem"
  }}>
      <summary style={{
    cursor: "pointer",
    fontWeight: 600,
    opacity: 0.72
  }}>
        버전 이력
      </summary>
      <table style={{
    borderCollapse: "collapse",
    width: "100%",
    margin: "0.5rem 0 0"
  }}>
        <thead>
          <tr>
            {headers.map(header => <th key={header} style={{
    ...cell,
    fontWeight: 600,
    opacity: 0.72
  }}>
                {header}
              </th>)}
          </tr>
        </thead>
        <tbody>
          {rows.map((row, row_index) => <tr key={row.id ?? row_index}>
              {(row.items ?? []).map((item, item_index) => <td key={item_index} style={{
    ...cell,
    overflowWrap: "anywhere"
  }}>
                  {item?.label}
                </td>)}
            </tr>)}
        </tbody>
      </table>
    </details>;
};

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>;
};

이 설정들은 [system.settings](/ko/reference/system-tables/settings)에서 확인할 수 있으며, [source](https://github.com/ClickHouse/ClickHouse/blob/master/src/Core/Settings.cpp)로부터 자동으로 생성됩니다.

<div id="optimize_trivial_approximate_count_query">
  ## optimize\_trivial\_approximate\_count\_query
</div>

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

이러한 추정을 지원하는 저장소(예: EmbeddedRocksDB)의 단순 count 최적화에는 근사값을 사용합니다.

가능한 값:

* 0 — 최적화가 비활성화됩니다.
  * 1 — 최적화가 활성화됩니다.

<div id="optimize_trivial_count_query">
  ## optimize\_trivial\_count\_query
</div>

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

MergeTree의 메타데이터를 사용해 단순한 `SELECT count() FROM table` 쿼리를 최적화하는 기능을 활성화하거나 비활성화합니다. 행 수준 보안(row-level security)을 사용해야 하는 경우 이 설정을 비활성화하십시오.

가능한 값:

* 0 — 최적화가 비활성화됩니다.
  * 1 — 최적화가 활성화됩니다.

관련 항목:

* [optimize\_functions\_to\_subcolumns](/ko/reference/settings/session-settings/optimize#optimize_functions_to_subcolumns)

<div id="optimize_trivial_count_with_sparsity_filter">
  ## optimize\_trivial\_count\_with\_sparsity\_filter
</div>

<BetaBadge />

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.8"},{"label": "1"},{"label": "베타로 승격하고 기본적으로 활성화합니다. `<pred>`가 행을 기본값과 비기본값으로 구분할 때, 영구 저장된 컬럼별 `num_defaults` \/ `num_rows` 카운터에서 `SELECT count() FROM t WHERE <pred>`를 처리합니다. MergeTree 설정 `compute_exact_num_defaults_for_sparse_columns`가 필요하며, 이제 이 설정도 기본적으로 활성화됩니다."}]}, {"id": "row-2","items": [{"label": "26.7"},{"label": "0"},{"label": "행을 기본값과 비기본값으로 정확히 구분하는 `<pred>`가 있을 때, `SELECT count() FROM t WHERE <pred>`를 `serialization.json`에 기록된 컬럼별 `num_defaults` \/ `num_rows`로 처리하기 위한 새로운(실험적) 설정입니다."}]}]} />

[optimize\_trivial\_count\_query](/ko/reference/settings/session-settings/optimize-trivial#optimize_trivial_count_query) 최적화를
`SELECT count() FROM t WHERE col <op> const` 형태의 쿼리까지 확장합니다. 여기서 `<op> const`는
행을 `col`의 기본값과 비기본값으로 정확히 구분해야 합니다. 그러면 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`(truthy 검사).

등호 비교 패턴은 `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\_count\_query](/ko/reference/settings/session-settings/optimize-trivial#optimize_trivial_count_query)

<div id="optimize_trivial_group_by_limit_query">
  ## optimize\_trivial\_group\_by\_limit\_query
</div>

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.5"},{"label": "1"},{"label": "`SELECT key_expr FROM t GROUP BY key_expr LIMIT n` 쿼리에서 집계를 최대 `LIMIT`개의 고유 키로 제한하는 새로운 설정입니다."}]}]} />

`max_rows_to_group_by = n + offset` 및 `group_by_overflow_mode = 'any'`를 설정하여 단순한 쿼리 `SELECT key_expr FROM table GROUP BY key_expr LIMIT n`의 최적화를 활성화하거나 비활성화합니다. 여기서 단순한 쿼리란 SELECT 항목에 집계 함수, 윈도우 함수 또는 `arrayJoin`이 없고, `HAVING`/`ORDER BY`/`QUALIFY`/`LIMIT BY`/`DISTINCT`/윈도우 절이 없으며, `GROUP BY` 수정자도 없는 쿼리를 의미합니다. `n + offset`개의 고유 키가 생성되면 집계가 중지됩니다.

사용자가 `group_by_overflow_mode`를 `any`가 아닌 값으로 명시적으로 설정한 경우(명시한 `throw`/`break` 동작을 유지하기 위해), 또는 이미 더 엄격한 `max_rows_to_group_by`를 설정한 경우(이 최적화는 no-op이므로)에는 이 최적화가 적용되지 않습니다.

가능한 값:

* 0 — 최적화가 비활성화됩니다.
* 1 — 최적화가 활성화됩니다.

<div id="optimize_trivial_insert_select">
  ## optimize\_trivial\_insert\_select
</div>

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "24.7"},{"label": "0"},{"label": "이 최적화는 많은 경우 의미가 없습니다."}]}]} />

단순한 'INSERT INTO table SELECT ... FROM TABLES' 쿼리를 최적화합니다

<div id="optimize_trivial_view_pushdown_to_distributed">
  ## optimize\_trivial\_view\_pushdown\_to\_distributed
</div>

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.8"},{"label": "1"},{"label": "분산 테이블 기반의 단순 뷰에 대해 전체 외부 쿼리를 세그먼트로 푸시하는 새로운 설정입니다."}]}]} />

활성화하면 `SELECT` 목록에 컬럼 참조, `*`,
또는 표현식만 포함하고(윈도우 함수나 스칼라 서브쿼리는 제외), 집계, 그룹화, 정렬 또는 조인이 없는 [분산](/ko/reference/engines/table-engines/special/distributed) 테이블 기반 뷰의 전체 외부 쿼리가
각 세그먼트로 푸시됩니다. 이를 통해 세그먼트에서 뷰의 필터와 표현식을 로컬로 적용할 수 있어 네트워크를 통해 전송되는 데이터 양이 줄어듭니다.

가능한 값:

* 0 — 최적화가 비활성화되며, `분산` 테이블 기반 뷰는 항상 코디네이터에서 실행됩니다.
* 1 — 최적화가 활성화됩니다.
