join_algorithm
- grace_hash
grace_hash_join_initial_buckets) 。这样做是为了确保每个桶都能独立处理。第一个桶中的行会加入内存中的哈希表,其余行则保存到磁盘。如果哈希表增长到超出内存限制 (例如,由 max_bytes_in_join 设置) ,则会增加桶的数量,并重新确定每一行所属的桶。不属于当前桶的行都会被刷出并重新分配。
支持 INNER/LEFT/RIGHT/FULL ALL/ANY JOIN。
- hash
JOIN ON 部分中通过 OR 组合的多个连接键。
使用 hash 算法时,JOIN 的右侧部分会被加载到 RAM 中。
- parallel_hash
hash join 的一种变体,它会将数据拆分到多个桶中,并并发构建多个哈希表,而不是只构建一个,以加快这一过程。
使用 parallel_hash 算法时,JOIN 的右侧部分会被加载到 RAM 中。
- partial_merge
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、EmbeddedRocksDB 和 MergeTree 表等特殊存储。
对于 MergeTree 表,该算法会将连接键过滤条件直接下推到存储层。如果该键可以利用表的主键索引进行 lookup,这种方式会更高效;否则,它会针对左表的每个块对右表执行全表扫描。
支持 INNER 和 LEFT join,并且仅支持不带其他条件的单列等值连接键。
- auto
auto 时,会先尝试 hash join;如果超出内存限制,则会动态切换到其他算法。
- full_sorting_merge
- prefer_partial_merge
partial_merge join,否则使用 hash。已弃用,等同于 partial_merge,hash。
- default (deprecated)
direct,hash,即尝试使用 direct join 和 hash join (按此顺序) 。
join_any_take_last_row
ANY 严格性 的 JOIN 操作行为。
此设置适用于
Join 引擎表以及基于哈希的 JOIN 算法。如果 join 是并行构建的,行的顺序可能是非确定性的。这意味着对于 ANY JOIN 查询,join_any_take_last_row = 1 可能会返回非确定性的行。- 0 — 如果右表中某个键对应多于一条匹配行,则仅关联找到的第一行。
- 1 — 如果右表中某个键对应多于一条匹配行,则仅关联找到的最后一行。
join_default_strictness
ALL— 如果右表有多行匹配,ClickHouse 会根据匹配行创建笛卡尔积。这是标准 SQL 中JOIN的常规行为。ANY— 如果右表有多行匹配,则只会连接找到的第一行。如果右表只有一行匹配,则ANY和ALL的结果相同。ASOF— 用于连接匹配关系不确定的序列。Empty string— 如果查询中未指定ALL或ANY,ClickHouse 会抛出异常。
join_on_disk_max_files_to_merge
- 任意大于等于 2 的正整数。
join_output_by_rowlist_perkey_rows_threshold
join_overflow_mode
join_algorithm
为 hash 和 parallel_hash 时生效。其他算法 (例如 partial_merge、grace_hash、auto) 处理这些限制的方式不同——例如落盘、重新分区或切换策略——请参见
join_algorithm。
可能值:
THROW— ClickHouse 抛出异常并停止查询。BREAK— ClickHouse 停止查询,但不抛出异常。
THROW。
另请参见