更新时间:2024-11-12 GMT+08:00
指定是否使用Semi Join的Hint
功能描述
指定join是否选择Semi Join。
语法格式
[no] semijoin([@queryblock] table_list)
参数说明
- no表示Semi Join的方式不使用。
- @queryblock请参见指定Hint所处的查询块Queryblock,可省略,表示在当前查询块生效。
- table_list表示hint表集合的字符串,该字符串中的表与join_table_list相同,但是中间不允许出现括号指定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 | -> Streaming (type: GATHER) 2 | -> Hash Join (3,4) 3 | -> Seq Scan on se_t2 4 | -> Hash 5 | -> HashAggregate 6 | -> Hash Join (7,8) 7 | -> Seq Scan on se_t1 8 | -> Hash 9 | -> Seq Scan on se_t3 (9 rows) Predicate Information (identified by plan id) ----------------------------------------------- 2 --Hash Join (3,4) Hash Cond: (se_t2.a = se_t1.a) 6 --Hash Join (7,8) Hash Cond: (se_t1.a = se_t3.a) (4 rows) --使用hint场景 gaussdb=# EXPLAIN(costs off) SELECT /*+ 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 | -> Streaming (type: GATHER) 2 | -> Hash Semi Join (3, 4) 3 | -> Seq Scan on se_t2 4 | -> Hash 5 | -> HashAggregate 6 | -> Hash Join (7,8) 7 | -> Seq Scan on se_t1 8 | -> Hash 9 | -> Seq Scan on se_t3 (9 rows) Predicate Information (identified by plan id) ----------------------------------------------- 2 --Hash Semi Join (3, 4) Hash Cond: (se_t2.a = se_t1.a) 6 --Hash Join (7,8) Hash Cond: (se_t1.a = se_t3.a) (4 rows)
可以看到semi join hint可以控制join是否使用Semi Join。
父主题: 使用Plan Hint进行调优