
# 指定是否使用Semi Join的Hint
#### 功能描述
指定join是否选择Semi Join。
#### 语法格式
```
[no] semijoin([@queryblock] table_list)
```
#### 参数说明
- no表示Semi Join的方式不使用。

- @queryblock请参见[指定Hint所处于的查询块Queryblock](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/gaussdb-42-0295.html#ZH-CN_TOPIC_0000002527988096)，可省略，表示在当前查询块生效。
- table_list表示hint表集合的字符串，该字符串中的表与[join_table_list](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/gaussdb-42-0297.html#ZH-CN_TOPIC_0000002527828152__zh-cn_topic_0000002527058332_zh-cn_topic_0283136909_zh-cn_topic_0237121533_section1280444714345)相同，只是中间不允许出现括号指定join的优先级。
- semijoin指定表连接是否使用Semi Join。
 
#### 示例
```
--准备
CREATE TABLE se_t1 (a int, b int);
CREATE TABLE se_t2 (a int, b int);
CREATE TABLE se_t3 (a int, b int);
set explain_perf_mode = pretty;  --打开explain pretty选项，可以看到更详尽计划
--不使用hint的情景
gaussdb=# EXPLAIN(costs off) SELECT a FROM se_t2 WHERE a IN( SELECT  se_t1.a FROM se_t1,se_t3 WHERE se_t1.a=se_t3.a GROUP BY 1);
 id |              operation               
----+--------------------------------------
  1 | ->  Hash Semi Join (2, 3)
  2 |    ->  Seq Scan on se_t2
  3 |    ->  Hash
  4 |       ->  HashAggregate
  5 |          ->  Hash Join (6,7)
  6 |             ->  Seq Scan on se_t1
  7 |             ->  Hash
  8 |                ->  Seq Scan on se_t3
(8 rows)
 Predicate Information (identified by plan id) 
-----------------------------------------------
   1 --Hash Semi Join (2, 3)
         Hash Cond: (se_t2.a = se_t1.a)
   5 --Hash Join (6,7)
         Hash Cond: (se_t1.a = se_t3.a)
(4 rows)
--使用semijoin hint关闭Semi Join
gaussdb=# EXPLAIN(costs off) SELECT /*+ NO SemiJoin(se_t2@"sel$1" "sel$2") */ a FROM se_t2 WHERE a IN( SELECT  se_t1.a FROM se_t1,se_t3 WHERE se_t1.a=se_t3.a GROUP BY 1);
 id |              operation               
----+--------------------------------------
  1 | ->  Hash Join (2,3)
  2 |    ->  Seq Scan on se_t2
  3 |    ->  Hash
  4 |       ->  HashAggregate
  5 |          ->  Hash Join (6,7)
  6 |             ->  Seq Scan on se_t1
  7 |             ->  Hash
  8 |                ->  Seq Scan on se_t3
(8 rows)
 Predicate Information (identified by plan id) 
-----------------------------------------------
   1 --Hash Join (2,3)
         Hash Cond: (se_t2.a = se_t1.a)
   5 --Hash Join (6,7)
         Hash Cond: (se_t1.a = se_t3.a)
(4 rows)
```
可以看到semijoin hint可以控制join是否使用Semi Join。
