用于 JOIN 操作的可选预构建数据结构。
创建表
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS 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 查询是以 变更 的形式实现的。DELETE 变更会读取过滤后的数据,并覆盖内存和磁盘中的数据。
限制与设置
创建表时,将应用以下设置:
join_use_nulls
max_rows_in_join
max_bytes_in_join
join_overflow_mode
join_any_take_last_row
join_use_nulls
持久化
禁用 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 │
└────┴─────┘