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及之后版本。
Mutil Join算子支持Empty Result Pruning
使用场景
Multi Join运行时剪枝,当某个表对应的状态为空时直接跳过该状态遍历,减少Multi Join中无效的递归扫描。
使用方法
配置Flink作业时,可通过在FlinkServer WebUI的Flink作业开发界面添加自定义参数“table.optimizer.multi-join.empty-result-pruning.enabled”为“true”开启Empty Result Pruning功能。
使用方法
配置Flink作业时,可通过在FlinkServer WebUI的Flink作业开发界面添加自定义参数“table.optimizer.multi-join.enabled”为“true”开启Multi Join功能,可参考集群连接模式创建Flink 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;