更新时间:2026-08-15 GMT+08:00
FlinkSQL支持Multi Join
使用场景
在FlinkSQL多表Join场景中,默认情况下多个Join操作会逐个执行,每个Join操作都会产生独立的中间状态(state),当关联表较多时,中间状态会大量累积,占用大量存储资源并降低作业性能。FlinkSQL支持Multi Join,在多表Join场景下可以将多个Join操作合并为一个Multi Join算子,有效地减少中间状态(state)。
约束与限制
- Multi Join不支持Join-To-Live特性。
- 使用Multi Join前后的快照互不兼容。
- 使用Multi Join多表关联时,表关联键需要一致。
- 本章节仅适用于MRS 3.6.0-LTS.1及之后版本。
使用方法
配置Flink作业时,可通过在FlinkServer WebUI的Flink作业开发界面添加自定义参数“table.optimizer.multi-join.enabled”为“true”开启Multi Join功能,可参考集群连接模式创建Flink SQL作业。
SQL示例:
CREATE TABLE datagen1 (id int, f1 int, PRIMARY KEY (id) NOT ENFORCED)
WITH
(
'connector' = 'datagen',
'rows-per-second' = '1'
);
CREATE TABLE datagen2 (id int, f2 int, PRIMARY KEY (id) NOT ENFORCED)
WITH
(
'connector' = 'datagen',
'rows-per-second' = '1'
);
CREATE TABLE datagen3 (id int, f3 int, PRIMARY KEY (id) NOT ENFORCED)
WITH
(
'connector' = 'datagen',
'rows-per-second' = '1'
);
CREATE TABLE datagen5 (id int, f5 int, PRIMARY KEY (id) NOT ENFORCED)
WITH
(
'connector' = 'datagen',
'rows-per-second' = '1'
);
CREATE TABLE datagen6 (id int, f6 int, PRIMARY KEY (id) NOT ENFORCED)
WITH
(
'connector' = 'datagen',
'rows-per-second' = '1'
);
CREATE TABLE print (id int, f1 int, f2 int, f3 int, f5 int, f6 int)
WITH
('connector' = 'print');
insert into
print
select
datagen1.id,
datagen1.f1,
datagen2.f2,
datagen3.f3,
datagen5.f5,
datagen6.f6
from
datagen1
left join datagen2 on datagen1.id = datagen2.id
and datagen2.id > 2
join datagen3 on datagen1.id = datagen3.id
and datagen3.id > 3
right join datagen5 on datagen1.id = datagen5.id
and datagen5.id > 5
full outer join datagen6 on datagen1.id = datagen6.id
and datagen6.id > 6
and datagen1.id > 1; Mutil Join算子支持Empty Result Pruning
使用场景
在Multi Join运行时,支持空结果剪枝。当某个表对应的状态为空时,直接跳过该状态的遍历,从而减少Multi Join中无效的递归扫描,提高查询性能和资源利用率。
使用方法
- 登录Manager界面,选择“集群 > 服务 > Flink”,在“Flink WebUI”右侧,单击链接,访问Flink的WebUI。
- 单击“作业管理”进入作业管理页面。
- 在FlinkServer作业管理界面,单击“新建作业”或选择已有作业,进入作业开发界面。
- 在作业开发界面的“自定义参数”配置“table.optimizer.multi-join.empty-result-pruning.enabled”的参数值为“true”开启Empty Result Pruning功能。
父主题: Flink企业级能力增强