> ## 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.

# join_* 세션 설정

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

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](/docs/ko/reference/system-tables/settings)에서 확인할 수 있으며, [source](https://github.com/ClickHouse/ClickHouse/blob/master/src/Core/Settings.cpp)를 기반으로 자동 생성됩니다.

<div id="join_algorithm">
  ## join\_algorithm
</div>

<SettingsInfoBlock type="JoinAlgorithm" default_value="direct,parallel_hash,hash" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "24.12"},{"label": "direct,parallel_hash,hash"},{"label": "'default'는 조인 알고리즘을 명시적으로 지정하는 방식으로 대체되어 Deprecated 상태가 되었으며, 이제 hash보다 parallel_hash가 우선 사용됩니다"}]}]} />

어떤 [JOIN](/docs/ko/reference/statements/select/join) 알고리즘을 사용할지 지정합니다.

여러 알고리즘을 지정할 수 있으며, 특정 쿼리에서는 kind/엄격성 및 테이블 엔진에 따라 사용 가능한 알고리즘이 선택됩니다.

가능한 값:

* grace\_hash

[Grace hash 조인](https://en.wikipedia.org/wiki/Hash_join#Grace_hash_join)을 사용합니다. Grace hash는 메모리 사용을 제한하면서도 복잡한 조인을 고성능으로 처리할 수 있는 알고리즘 옵션입니다.

grace 조인의 첫 번째 단계에서는 오른쪽 테이블을 읽고 키 컬럼의 해시 값에 따라 N개의 버킷으로 분할합니다(초기 N 값은 `grace_hash_join_initial_buckets`입니다). 이는 각 버킷을 독립적으로 처리할 수 있도록 수행됩니다. 첫 번째 버킷의 행은 메모리 내 해시 테이블에 추가되고, 나머지는 디스크에 저장됩니다. 해시 테이블이 메모리 제한을 초과하면(예: [`max_bytes_in_join`](/docs/ko/reference/settings/session-settings/max-bytes#max_bytes_in_join)로 설정한 경우) 버킷 수를 늘리고 각 행에 할당된 버킷을 다시 계산합니다. 현재 버킷에 속하지 않는 행은 모두 플러시되고 재할당됩니다.

`INNER/LEFT/RIGHT/FULL ALL/ANY JOIN`을 지원합니다.

* hash

[해시 조인 알고리즘](https://en.wikipedia.org/wiki/Hash_join)을 사용합니다. kind와 엄격성의 모든 조합을 지원하며, `JOIN ON` 절에서 `OR`로 결합된 여러 조인 키도 지원하는 가장 범용적인 구현입니다.

`hash` 알고리즘을 사용할 때는 `JOIN`의 오른쪽 부분을 RAM에 업로드합니다.

* parallel\_hash

`hash` 조인의 변형으로, 데이터를 버킷으로 분할하고 하나의 해시 테이블 대신 여러 해시 테이블을 동시에 구축하여 이 과정을 더 빠르게 처리합니다.

`parallel_hash` 알고리즘을 사용할 때는 `JOIN`의 오른쪽 부분을 RAM에 업로드합니다.

* partial\_merge

오른쪽 테이블만 완전히 정렬하는 [sort-merge algorithm](https://en.wikipedia.org/wiki/Sort-merge_join)의 변형입니다.

`RIGHT JOIN`과 `FULL JOIN`은 `ALL` 엄격성에서만 지원됩니다(`SEMI`, `ANTI`, `ANY`, `ASOF`는 지원되지 않음).

`partial_merge` 알고리즘을 사용할 때 ClickHouse는 데이터를 정렬한 뒤 디스크에 기록합니다. ClickHouse의 `partial_merge` 알고리즘은 고전적인 구현과 약간 다릅니다. 먼저 ClickHouse는 오른쪽 테이블을 블록 단위로 조인 키 기준 정렬하고, 정렬된 블록에 대해 MinMax 인덱스를 생성합니다. 그런 다음 왼쪽 테이블의 일부를 `join key` 기준으로 정렬한 뒤 오른쪽 테이블과 조인합니다. 불필요한 오른쪽 테이블 블록을 건너뛰는 데에도 MinMax 인덱스가 사용됩니다.

* direct

`direct`(nested loop라고도 함) 알고리즘은 왼쪽 테이블의 행을 키로 사용해 오른쪽 테이블에서 lookup을 수행합니다.
[Dictionary](/docs/ko/reference/engines/table-engines/special/dictionary), [EmbeddedRocksDB](/docs/ko/reference/engines/table-engines/integrations/embedded-rocksdb), [MergeTree](/docs/ko/reference/engines/table-engines/mergetree-family/mergetree) 테이블과 같은 특수 스토리지에서 지원됩니다.

MergeTree 테이블의 경우 이 알고리즘은 조인 키 필터를 스토리지 계층으로 직접 푸시다운합니다. 키가 테이블의 프라이머리 키 인덱스를 lookup에 사용할 수 있으면 더 효율적일 수 있지만, 그렇지 않으면 왼쪽 테이블의 각 블록마다 오른쪽 테이블 전체를 스캔합니다.

`INNER` 및 `LEFT` 조인만 지원하며, 다른 조건 없이 단일 컬럼 동등 조인 키만 지원합니다.

* auto

`auto`로 설정하면 먼저 `hash` 조인을 시도하고, 메모리 제한을 초과하면 실행 중에 다른 알고리즘으로 전환합니다.

* full\_sorting\_merge

조인 전에 조인 대상 테이블을 완전히 정렬하는 [Sort-merge algorithm](https://en.wikipedia.org/wiki/Sort-merge_join)입니다.

* prefer\_partial\_merge

ClickHouse는 가능하면 항상 `partial_merge` 조인을 사용하려고 시도하며, 그렇지 않으면 `hash`를 사용합니다. *Deprecated*이며, `partial_merge,hash`와 같습니다.

* default (deprecated)

레거시 값이므로 더 이상 사용하지 마십시오.
`direct,hash`와 같으며, 즉 direct 조인과 hash 조인을 이 순서대로 사용하려고 시도합니다.

<div id="join_any_take_last_row">
  ## join\_any\_take\_last\_row
</div>

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

오른쪽 테이블에서 하나의 키에 일치하는 행이 여러 개 있을 때 `ANY` 엄격성을 사용하는 JOIN 작업의 동작을 변경합니다.

<Note>
  이 설정은 [`Join`](/docs/ko/reference/engines/table-engines/special/join) 테이블 엔진을 사용하는 테이블과 해시 기반 조인 알고리즘에 적용됩니다.

  조인이 병렬로 구성되면 행의 순서가 비결정적일 수 있습니다. 즉, `join_any_take_last_row = 1`은 `ANY JOIN` 쿼리에서 비결정적인 행을 반환할 수 있습니다.
</Note>

가능한 값:

* 0 — 오른쪽 테이블에 일치하는 행이 여러 개 있으면, 먼저 발견된 행만 조인됩니다.
* 1 — 오른쪽 테이블에 일치하는 행이 여러 개 있으면, 마지막에 발견된 행만 조인됩니다.

관련 항목:

* [JOIN 절](/docs/ko/reference/statements/select/join)
* [Join 테이블 엔진](/docs/ko/reference/engines/table-engines/special/join)
* [join\_default\_strictness](/docs/ko/reference/settings/session-settings/join#join_default_strictness)

<div id="join_default_strictness">
  ## join\_default\_strictness
</div>

<SettingsInfoBlock type="JoinStrictness" default_value="ALL" />

[JOIN 절](/docs/ko/reference/statements/select/join)의 기본 엄격성을 설정합니다.

가능한 값:

* `ALL` — 오른쪽 테이블에 일치하는 행이 여러 개 있으면 ClickHouse는 일치하는 행들로 [카테시안 곱](https://en.wikipedia.org/wiki/Cartesian_product)을 생성합니다. 이는 표준 SQL의 일반적인 `JOIN` 동작입니다.
* `ANY` — 오른쪽 테이블에 일치하는 행이 여러 개 있으면, 먼저 찾은 첫 번째 행만 조인됩니다. 오른쪽 테이블에 일치하는 행이 하나뿐이면 `ANY`와 `ALL`의 결과는 같습니다.
* `ASOF` — 정확히 일치하지 않는 시퀀스를 조인할 때 사용합니다.
* `빈 문자열` — 쿼리에서 `ALL` 또는 `ANY`를 지정하지 않으면 ClickHouse가 예외를 발생시킵니다.

<div id="join_on_disk_max_files_to_merge">
  ## join\_on\_disk\_max\_files\_to\_merge
</div>

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

디스크에서 실행되는 MergeJoin 작업의 병렬 정렬에 사용할 수 있는 파일 수를 제한합니다.

이 설정값이 클수록 더 많은 RAM을 사용하고, 필요한 디스크 I/O는 줄어듭니다.

가능한 값:

* 2 이상의 모든 양의 정수.

<div id="join_output_by_rowlist_perkey_rows_threshold">
  ## join\_output\_by\_rowlist\_perkey\_rows\_threshold
</div>

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "24.9"},{"label": "5"},{"label": "해시 조인에서 행 목록으로 출력할지 결정할 때 사용하는, 오른쪽 테이블의 키별 평균 행 수 하한값입니다."}]}]} />

해시 조인에서 행 목록으로 출력할지 결정할 때 사용하는, 오른쪽 테이블의 키별 평균 행 수 하한값입니다.

<div id="join_overflow_mode">
  ## join\_overflow\_mode
</div>

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

조인이 다음 제한 중 하나에 도달할 때 ClickHouse가 수행할 동작을 정의합니다:

* [max\_bytes\_in\_join](/docs/ko/reference/settings/session-settings/max-bytes#max_bytes_in_join)
* [max\_rows\_in\_join](/docs/ko/reference/settings/session-settings/max-rows#max_rows_in_join)

이 설정은 [`join_algorithm`](/docs/ko/reference/settings/session-settings/join#join_algorithm)
값이 `hash` 또는 `parallel_hash`일 때만 적용됩니다. 다른
알고리즘(예: `partial_merge`, `grace_hash`, `auto`)은 이러한
제한을 디스크로 스필하거나, 다시 파티셔닝하거나, 전략을 전환하는 방식으로
다르게 처리합니다. 자세한 내용은
[`join_algorithm`](/docs/ko/reference/settings/session-settings/join#join_algorithm)을 참조하십시오.

가능한 값:

* `THROW` — ClickHouse는 예외를 발생시키고 쿼리를 중지합니다.
* `BREAK` — ClickHouse는 쿼리를 중지하고 예외를 발생시키지 않습니다.

기본값: `THROW`.

**관련 항목**

* [JOIN 절](/docs/ko/reference/statements/select/join)
* [조인 테이블 엔진](/docs/ko/reference/engines/table-engines/special/join)

<div id="join_use_nulls">
  ## join\_use\_nulls
</div>

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

[JOIN](/docs/ko/reference/statements/select/join)의 동작 방식을 설정합니다. 테이블을 병합할 때 빈 셀이 생길 수 있습니다. ClickHouse는 이 설정에 따라 이를 서로 다르게 채웁니다.

가능한 값:

* 0 — 빈 셀은 해당 필드 유형의 기본값으로 채워집니다.
* 1 — `JOIN`은 표준 SQL과 동일하게 동작합니다. 해당 필드의 유형은 [Nullable](/docs/ko/reference/data-types/nullable)로 변환되며, 빈 셀은 [NULL](/docs/ko/reference/syntax)로 채워집니다.
