> ## 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_*

> Настройки сеанса ClickHouse в автоматически сгенерированной группе join_*.

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/ru/reference/system-tables/settings) и автоматически сгенерированы на основе [исходного кода](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' объявлен устаревшим в пользу явно заданных алгоритмов JOIN; кроме того, теперь parallel_hash предпочтительнее hash"}]}]} />

Указывает, какой алгоритм [JOIN](/docs/ru/reference/statements/select/join) используется.

Можно указать несколько алгоритмов; для конкретного запроса будет выбран доступный вариант в зависимости от kind/strictness и движка таблицы.

Возможные значения:

* grace\_hash

Используется [Grace hash join](https://en.wikipedia.org/wiki/Hash_join#Grace_hash_join). Grace hash — это вариант алгоритма, обеспечивающий производительное выполнение сложных JOIN при ограниченном потреблении памяти.

На первом этапе grace JOIN считывает правую таблицу и разбивает её на N бакетов в зависимости от значения hash в столбцах ключа (изначально N равно `grace_hash_join_initial_buckets`). Это делается так, чтобы каждый бакет можно было обрабатывать независимо. Строки из первого бакета добавляются во внутреннюю hash table, а остальные сохраняются на disk. Если hash table вырастает сверх memory limit (например, заданного через [`max_bytes_in_join`](/docs/ru/reference/settings/session-settings/max-bytes#max_bytes_in_join)), количество бакетов увеличивается, и для каждой строки заново определяется назначенный бакет. Все строки, которые не принадлежат текущему бакету, сбрасываются и перераспределяются.

Поддерживает `INNER/LEFT/RIGHT/FULL ALL/ANY JOIN`.

* hash

Используется [алгоритм Hash join](https://en.wikipedia.org/wiki/Hash_join). Это наиболее универсальная реализация, поддерживающая все комбинации kind и strictness, а также несколько ключей JOIN, объединённых с помощью `OR` в секции `JOIN ON`.

При использовании алгоритма `hash` правая часть `JOIN` загружается в оперативную память.

* parallel\_hash

Вариант `hash` JOIN, который разбивает данные на бакеты и параллельно строит несколько hash table вместо одной, чтобы ускорить этот процесс.

При использовании алгоритма `parallel_hash` правая часть `JOIN` загружается в оперативную память.

* partial\_merge

Вариант [алгоритма sort-merge](https://en.wikipedia.org/wiki/Sort-merge_join), в котором полностью сортируется только правая таблица.

`RIGHT JOIN` и `FULL JOIN` поддерживаются только со strictness `ALL` (`SEMI`, `ANTI`, `ANY` и `ASOF` не поддерживаются).

При использовании алгоритма `partial_merge` ClickHouse сортирует данные и выгружает их на disk. Алгоритм `partial_merge` в ClickHouse немного отличается от классической реализации. Сначала ClickHouse сортирует правую таблицу по join keys блоками и создаёт min-max index для отсортированных блоков. Затем он сортирует части левой таблицы по `join key` и выполняет их JOIN с правой таблицей. Min-max index также используется для пропуска ненужных блоков правой таблицы.

* direct

Алгоритм `direct` (также известный как nested loop) выполняет lookup в правой таблице, используя строки из левой таблицы в качестве ключей.
Он поддерживается специальными хранилищами, такими как [Dictionary](/docs/ru/reference/engines/table-engines/special/dictionary), [EmbeddedRocksDB](/docs/ru/reference/engines/table-engines/integrations/embedded-rocksdb) и таблицами [MergeTree](/docs/ru/reference/engines/table-engines/mergetree-family/mergetree).

Для таблиц MergeTree алгоритм передаёт фильтры по join key напрямую на уровень хранения. Это может быть эффективнее, если ключ позволяет использовать primary key index таблицы для lookup; в противном случае для каждого блока левой таблицы выполняется полное сканирование правой таблицы.

Поддерживает `INNER` и `LEFT` joins и только одностолбцовые ключи JOIN по равенству без дополнительных условий.

* auto

Если установлено значение `auto`, сначала пробуется `hash` JOIN, а затем алгоритм на лету переключается на другой, если превышается memory limit.

* full\_sorting\_merge

[Алгоритм sort-merge](https://en.wikipedia.org/wiki/Sort-merge_join) с полной сортировкой соединяемых таблиц перед выполнением JOIN.

* prefer\_partial\_merge

ClickHouse всегда пытается использовать JOIN `partial_merge`, если это возможно; в противном случае используется `hash`. *Устарело*, то же самое, что `partial_merge,hash`.

* default (deprecated)

Устаревшее значение, больше его не используйте.
То же самое, что `direct,hash`, то есть сначала используется direct join, а затем hash join (в этом порядке).

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

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

Изменяет поведение операций JOIN со strictness `ANY`, когда в правой таблице для ключа есть более одной совпадающей строки.

<Note>
  Этот параметр применяется к таблицам с движком [`Join`](/docs/ru/reference/engines/table-engines/special/join) и алгоритмам JOIN на основе хеша.

  Если JOIN строится параллельно, порядок строк может быть недетерминированным. Это означает, что `join_any_take_last_row = 1` может возвращать недетерминированную строку для запросов `ANY JOIN`.
</Note>

Возможные значения:

* 0 — Если в правой таблице есть более одной совпадающей строки, присоединяется только первая найденная.
* 1 — Если в правой таблице есть более одной совпадающей строки, присоединяется только последняя найденная.

См. также:

* [предложение JOIN](/docs/ru/reference/statements/select/join)
* [движок таблицы Join](/docs/ru/reference/engines/table-engines/special/join)
* [join\_default\_strictness](/docs/ru/reference/settings/session-settings/join#join_default_strictness)

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

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

Задаёт strictness по умолчанию для [секций JOIN](/docs/ru/reference/statements/select/join).

Возможные значения:

* `ALL` — Если в правой таблице есть несколько совпадающих строк, ClickHouse создаёт [декартово произведение](https://en.wikipedia.org/wiki/Cartesian_product) из совпадающих строк. Это обычное поведение `JOIN` в стандартном SQL.
* `ANY` — Если в правой таблице есть несколько совпадающих строк, присоединяется только первая найденная. Если в правой таблице есть только одна совпадающая строка, результаты `ANY` и `ALL` будут одинаковыми.
* `ASOF` — Для соединения последовательностей с неточным совпадением.
* `Empty string` — Если в запросе не указаны `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 при их выполнении на диске.

Чем больше значение настройки, тем больше используется оперативной памяти и тем меньше требуется дисковых операций ввода-вывода.

Возможные значения:

* Любое положительное целое число, начиная с 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": "Нижний порог среднего числа строк на ключ в правой таблице, определяющий, следует ли использовать вывод по списку строк при hash JOIN."}]}]} />

Нижний порог среднего числа строк на ключ в правой таблице, определяющий, следует ли использовать вывод по списку строк при hash JOIN.

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

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

Определяет, какое действие выполняет ClickHouse, когда при JOIN достигается одно из следующих ограничений:

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

Этот параметр действует только для значений `hash` и `parallel_hash`
параметра [`join_algorithm`](/docs/ru/reference/settings/session-settings/join#join_algorithm). Другие
алгоритмы (например, `partial_merge`, `grace_hash`, `auto`) обрабатывают
эти ограничения иначе — выгружают данные на диск, переразбивают их на партиции или переключают
стратегию — см.
[`join_algorithm`](/docs/ru/reference/settings/session-settings/join#join_algorithm).

Возможные значения:

* `THROW` — ClickHouse генерирует исключение и останавливает запрос.
* `BREAK` — ClickHouse останавливает запрос и не генерирует исключение.

Значение по умолчанию: `THROW`.

**См. также**

* [предложение JOIN](/docs/ru/reference/statements/select/join)
* [движок таблицы Join](/docs/ru/reference/engines/table-engines/special/join)

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

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

Задает поведение [JOIN](/docs/ru/reference/statements/select/join). При слиянии таблиц могут появляться пустые ячейки. ClickHouse заполняет их по-разному в зависимости от этой настройки.

Возможные значения:

* 0 — Пустые ячейки заполняются значением по умолчанию для типа соответствующего поля.
* 1 — `JOIN` ведет себя так же, как в стандартном SQL. Тип соответствующего поля преобразуется в [Nullable](/docs/ru/reference/data-types/nullable), а пустые ячейки заполняются значением [NULL](/docs/ru/reference/syntax).
