跳到主要内容
跳到主要内容

Join 表引擎

用于 JOIN 操作的可选预处理数据结构。

注意

这不是一篇关于 JOIN 子句本身的文章。

创建表

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2],
) ENGINE = Join(join_strictness, join_type, k1[, k2, ...])

请参阅 CREATE TABLE 查询的详细描述。

引擎参数

join_strictness

join_strictnessJOIN 严格性

join_type

join_typeJOIN 类型

键列

k1[, k2, ...] – 来自 USING 子句的键列,JOIN 操作使用这些键列。

输入 join_strictness 和 join_type 参数时不要加引号,例如,Join(ANY, LEFT, col1)。它们必须与表将要使用的 JOIN 操作匹配。如果参数不匹配,ClickHouse 不会抛出异常,并可能返回不正确的数据。

具体说明和建议

数据存储

Join 表数据始终位于 RAM 中。当将行插入表时,ClickHouse 将数据块写入磁盘上的目录,以便在服务器重启时可以恢复它们。

如果服务器重启不正确,磁盘上的数据块可能会丢失或损坏。在这种情况下,您可能需要手动删除损坏数据的文件。

选择和插入数据

您可以使用 INSERT 查询向 Join-引擎表添加数据。如果表是使用 ANY 严格性创建的,则重复键的数据将被忽略。使用 ALL 严格性,将添加所有行。

Join-引擎表的主要用例如下

  • 将表放在 JOIN 子句的右侧。
  • 调用 joinGet 函数,该函数允许您以与从字典中提取数据相同的方式从表中提取数据。

删除数据

Join-引擎表的 ALTER DELETE 查询实现为 mutationDELETE mutation 读取过滤后的数据并覆盖内存和磁盘的数据。

限制和设置

创建表时,将应用以下设置

join_use_nulls

join_use_nulls

max_rows_in_join

max_rows_in_join

max_bytes_in_join

max_bytes_in_join

join_overflow_mode

join_overflow_mode

join_any_take_last_row

join_any_take_last_row

join_use_nulls

persistent

禁用 Join 和 Set 表引擎的持久性。

减少 I/O 开销。适用于追求性能且不需要持久性的场景。

可能的值

  • 1 — 启用。
  • 0 — 禁用。

默认值: 1

Join-引擎表不能在 GLOBAL JOIN 操作中使用。

Join-引擎允许在 CREATE TABLE 语句中指定 join_use_nulls 设置。SELECT 查询应具有相同的 join_use_nulls 值。

使用示例

创建左侧表

CREATE TABLE id_val(`id` UInt32, `val` UInt32) ENGINE = TinyLog;
INSERT INTO id_val VALUES (1,11)(2,12)(3,13);

创建右侧 Join

CREATE TABLE id_val_join(`id` UInt32, `val` UInt8) ENGINE = Join(ANY, LEFT, id);
INSERT INTO id_val_join VALUES (1,21)(1,22)(3,23);

连接表

SELECT * FROM id_val ANY LEFT JOIN id_val_join USING (id);
┌─id─┬─val─┬─id_val_join.val─┐
│ 1 │ 11 │ 21 │
│ 2 │ 12 │ 0 │
│ 3 │ 13 │ 23 │
└────┴─────┴─────────────────┘

作为替代方案,您可以从 Join 表中检索数据,并指定连接键值

SELECT joinGet('id_val_join', 'val', toUInt32(1));
┌─joinGet('id_val_join', 'val', toUInt32(1))─┐
│ 21 │
└────────────────────────────────────────────┘

Join 表中删除行

ALTER TABLE id_val_join DELETE WHERE id = 3;
┌─id─┬─val─┐
│ 1 │ 21 │
└────┴─────┘