> ## 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/zh/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'，改为显式指定 join 算法，同时现在优先使用 parallel_hash 而不是 hash"}]}]} />

指定使用哪种 [JOIN](/docs/zh/reference/statements/select/join) 算法。

可以指定多种算法，系统会根据具体查询的 kind/严格性 和表引擎选择可用的算法。

可能的值：

* grace\_hash

使用 [Grace hash join](https://en.wikipedia.org/wiki/Hash_join#Grace_hash_join)。Grace hash 提供了一种算法选项，可在限制内存使用的同时，高效处理复杂连接。

grace join 的第一阶段会读取右表，并根据键列的哈希值将其拆分为 N 个桶 (初始时，N 为 `grace_hash_join_initial_buckets`) 。这样做是为了确保每个桶都能独立处理。第一个桶中的行会加入内存中的哈希表，其余行则保存到磁盘。如果哈希表增长到超出内存限制 (例如，由 [`max_bytes_in_join`](/docs/zh/reference/settings/session-settings/max-bytes#max_bytes_in_join) 设置) ，则会增加桶的数量，并重新确定每一行所属的桶。不属于当前桶的行都会被刷出并重新分配。

支持 `INNER/LEFT/RIGHT/FULL ALL/ANY JOIN`。

* hash

使用 [Hash join algorithm](https://en.wikipedia.org/wiki/Hash_join)。这是最通用的实现，支持所有 kind 和 严格性 的组合，也支持在 `JOIN ON` 部分中通过 `OR` 组合的多个连接键。

使用 `hash` 算法时，`JOIN` 的右侧部分会被加载到 RAM 中。

* parallel\_hash

这是 `hash` join 的一种变体，它会将数据拆分到多个桶中，并并发构建多个哈希表，而不是只构建一个，以加快这一过程。

使用 `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 会按连接键对右表分块排序，并为已排序的块创建 min-max 索引。然后，它会按 `join key` 对左表的各个部分进行排序，并与右表执行连接。min-max 索引也会用于跳过不需要读取的右表块。

* direct

`direct` (也称为 nested loop) 算法会使用左表中的行作为键，在右表中执行 lookup。
它适用于 [Dictionary](/docs/zh/reference/engines/table-engines/special/dictionary)、[EmbeddedRocksDB](/docs/zh/reference/engines/table-engines/integrations/embedded-rocksdb) 和 [MergeTree](/docs/zh/reference/engines/table-engines/mergetree-family/mergetree) 表等特殊存储。

对于 MergeTree 表，该算法会将连接键过滤条件直接下推到存储层。如果该键可以利用表的主键索引进行 lookup，这种方式会更高效；否则，它会针对左表的每个块对右表执行全表扫描。

支持 `INNER` 和 `LEFT` join，并且仅支持不带其他条件的单列等值连接键。

* auto

设置为 `auto` 时，会先尝试 `hash` join；如果超出内存限制，则会动态切换到其他算法。

* full\_sorting\_merge

[Sort-merge algorithm](https://en.wikipedia.org/wiki/Sort-merge_join)，会在连接前对参与连接的表进行完全排序。

* prefer\_partial\_merge

如果可能，ClickHouse 总是会尝试使用 `partial_merge` join，否则使用 `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" />

当右表中某个键对应多于一条匹配行时，此设置会更改具有 `ANY` 严格性 的 JOIN 操作行为。

<Note>
  此设置适用于 [`Join`](/docs/zh/reference/engines/table-engines/special/join) 引擎表以及基于哈希的 JOIN 算法。

  如果 join 是并行构建的，行的顺序可能是非确定性的。这意味着对于 `ANY JOIN` 查询，`join_any_take_last_row = 1` 可能会返回非确定性的行。
</Note>

可能的值：

* 0 — 如果右表中某个键对应多于一条匹配行，则仅关联找到的第一行。
* 1 — 如果右表中某个键对应多于一条匹配行，则仅关联找到的最后一行。

另请参阅：

* [JOIN clause](/docs/zh/reference/statements/select/join)
* [Join 表引擎](/docs/zh/reference/engines/table-engines/special/join)
* [join\_default\_strictness](/docs/zh/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/zh/reference/statements/select/join)的默认严格性。

可能的值：

* `ALL` — 如果右表有多行匹配，ClickHouse 会根据匹配行创建[笛卡尔积](https://en.wikipedia.org/wiki/Cartesian_product)。这是标准 SQL 中 `JOIN` 的常规行为。
* `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 操作在磁盘上执行时，并行排序可使用的文件数量。

该设置的值越大，占用的 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": "在 hash join 中，用于判断是否按行列表输出的右表每个键平均行数下限。"}]}]} />

在 hash join 中，用于判断是否按行列表输出的右表每个键平均行数下限。

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

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

定义了当 join 达到以下任一限制时，ClickHouse 将执行的操作：

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

此设置仅对 [`join_algorithm`](/docs/zh/reference/settings/session-settings/join#join_algorithm)
为 `hash` 和 `parallel_hash` 时生效。其他算法 (例如 `partial_merge`、`grace_hash`、`auto`) 处理这些限制的方式不同——例如落盘、重新分区或切换策略——请参见
[`join_algorithm`](/docs/zh/reference/settings/session-settings/join#join_algorithm)。

可能值：

* `THROW` — ClickHouse 抛出异常并停止查询。
* `BREAK` — ClickHouse 停止查询，但不抛出异常。

默认值：`THROW`。

**另请参见**

* [JOIN 子句](/docs/zh/reference/statements/select/join)
* [Join 表引擎](/docs/zh/reference/engines/table-engines/special/join)

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

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

设置 [JOIN](/docs/zh/reference/statements/select/join) 的行为方式。合并表时，可能会出现空单元。ClickHouse 会根据此设置采用不同方式填充这些空单元。

可能的值：

* 0 — 空单元将使用相应字段类型的默认值填充。
* 1 — `JOIN` 的行为与 standard SQL 相同。相应字段的类型会转换为 [Nullable](/docs/zh/reference/data-types/nullable)，空单元则会填充为 [NULL](/docs/zh/reference/syntax)。
