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

# optimize_or_like_chain_* 세션 설정

> optimize_or_like_chain_* 생성 그룹에 속한 ClickHouse 세션 설정입니다.

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)에서 확인할 수 있으며, [소스 코드](https://github.com/ClickHouse/ClickHouse/blob/master/src/Core/Settings.cpp)에서 자동 생성됩니다.

<div id="optimize_or_like_chain">
  ## optimize\_or\_like\_chain
</div>

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

동일한 표현식에 대한 여러 `OR LIKE/ILIKE/match` 프레디케이트를 단일 `multiSearchAny`/`multiSearchAnyCaseInsensitiveUTF8`(순수 부분 문자열 `%needle%` 패턴의 경우) 또는 `multiMatchAny`(기타 패턴의 경우, Hyperscan/Vectorscan이 허용되면)로 최적화합니다. 어느 쪽의 빠른 경로도 적용할 수 없는 경우 — 예를 들어 Hyperscan이 비활성화되어 있거나 사용할 수 없거나, 패턴이 원시 `match` 정규식이거나, 유효한 UTF-8이 아니거나, 내장 NUL을 포함하거나, haystack이 `FixedString`/`Enum`인 경우 — 결합된 `match` 교대식이 RE2에서는 원래의 단락 평가 `OR`보다 일관되게 느리므로 원래 `OR` 체인을 변경 없이 유지합니다.

이 최적화는 분석기(`enable_analyzer = 1`, 기본값)를 사용할 때만 적용됩니다. 이전 분석기(`enable_analyzer = 0`)에서는 `OR` 체인을 변경하지 않습니다. 순수한 `LIKE`/`ILIKE`/`match` `OR` 체인의 경우 인덱스 분석이 가능하도록 원래 표현식을 `indexHint()`에 보존합니다. `LIKE`가 아닌 분기를 포함하는 혼합 `OR` 체인은 `LIKE`가 아닌 분기에만 일치하는 범위까지 프루닝되지 않도록 의도적으로 `indexHint()` 래핑을 적용하지 않습니다. `multiMatchAny` 재작성은 `allow_hyperscan`, `max_hyperscan_regexp_length`, `max_hyperscan_regexp_total_length`, `reject_expensive_hyperscan_regexps`를 따릅니다.

체인은 동일한 좌변 표현식을 공유하는 분기가 충분히 많아 재작성이 단락 평가 `OR`보다 확실히 더 빠르다고 판단될 때만 재작성됩니다. `multiSearchAny` 경로에는 최소 `optimize_or_like_chain_min_substrings`개의 분기가 필요하고, `multiMatchAny` 경로에는 최소 `optimize_or_like_chain_min_patterns`개의 분기가 필요합니다.

<div id="optimize_or_like_chain_min_patterns">
  ## optimize\_or\_like\_chain\_min\_patterns
</div>

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

동일한 좌변 표현식을 공유하는 순수 부분 문자열이 아닌 `LIKE`/`ILIKE`/`match` 분기(prefix/suffix/regexp 패턴)가 `optimize_or_like_chain`에 의해 체인에서 `multiMatchAny`로 재작성되기 위해 필요한 최소 개수입니다. `hits` 데이터셋을 기준으로 보정되었습니다(`tests/performance/optimize_or_like_chain_hits.xml` 참조). prefix/regexp `LIKE` 체인에 대한 `multiMatchAny`(Hyperscan) 재작성은 대략 9개의 분기부터만 단락 평가 `OR` 평가보다 빨라지므로, 더 짧은 체인은 성능 저하를 피하기 위해 그대로 유지됩니다. 값이 0 또는 1이면 이 임계값이 비활성화됩니다. `optimize_or_like_chain`이 비활성화된 경우에는 영향을 주지 않습니다. 순수 부분 문자열(`multiSearchAny`) 경로는 `optimize_or_like_chain_min_substrings`도 참조하십시오.

<div id="optimize_or_like_chain_min_substrings">
  ## optimize\_or\_like\_chain\_min\_substrings
</div>

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

동일한 좌변 표현식을 공유하는 순수 부분 문자열(`%needle%`) `LIKE`/`ILIKE` 분기를 `optimize_or_like_chain`이 `multiSearchAny`/`multiSearchAnyCaseInsensitiveUTF8`로 재작성하려면 필요한 최소 개수입니다. `hits` 데이터셋(`tests/performance/optimize_or_like_chain_hits.xml` 참조)을 기준으로 조정한 결과, 대략 4개의 분기부터 `multiSearchAny` 재작성이 단락 `OR` 평가보다 더 빨라집니다. 값이 0 또는 1이면 이 임계값이 비활성화됩니다. `optimize_or_like_chain`이 비활성화되어 있으면 효과가 없습니다. regexp(`multiMatchAny`) 경로는 `optimize_or_like_chain_min_patterns`도 참조하십시오.
