
# 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作业](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_24024.html)。
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中无效的递归扫描，提高查询性能和资源利用率。
**使用方法**
1. 登录Manager界面，选择"集群 \> 服务 \> Flink"，在"Flink WebUI"右侧，单击链接，访问Flink的WebUI。
2. 单击"作业管理"进入作业管理页面。
3. 在FlinkServer作业管理界面，单击"新建作业"或选择已有作业，进入作业开发界面。
4. 在作业开发界面的"自定义参数"配置"table.optimizer.multi-join.empty-result-pruning.enabled"的参数值为"true"开启Empty Result Pruning功能。
 
