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_strictness
- JOIN 严格性。
join_type
join_type
- JOIN 类型。
键列
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
查询被实现为 mutation。DELETE
mutation 会读取过滤后的数据,并覆盖内存和磁盘的数据。
限制和设置
创建表时,会应用以下设置
join_use_nulls
max_rows_in_join
max_bytes_in_join
join_overflow_mode
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 │
└────┴─────┘