
# 指定Any子链接提升的Hint
#### 功能描述
在进行Any子链接提升时指定优化算子的方法。
#### 语法格式
```
[no] hashed_sublink[(@queryblock)], material_sublink[(@queryblock)]
```
#### 参数说明
- no表示该优化的方式不使用。
- @queryblock请参见[指定Hint所处于的查询块Queryblock](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/gaussdb-42-0295.html#ZH-CN_TOPIC_0000002527988096)，可省略，表示在当前查询块生效，当不指定时，hint没有括号"()"。

- hashed_sublink对指定子链接使用哈希表优化。

- material_sublink对指定子链接使用物化优化。
 
#### 示例
- material_sublink
  **建表语句** ：
  ```
  CREATE TABLE SUPPLIER (
      S_SUPPKEY BIGINT NOT NULL,
      S_NAME CHAR(25) NOT NULL,
      S_ADDRESS VARCHAR(40) NOT NULL,
      S_NATIONKEY INT NOT NULL,
      S_PHONE CHAR(15) NOT NULL,
      S_ACCTBAL DECIMAL(15, 2) NOT NULL,
      S_COMMENT VARCHAR(101) NOT NULL,
      S_STATEKEY INT NOT NULL
  );
  set explain_perf_mode = pretty; --打开explain pretty选项，可以看到更详尽计划
  ```
  **示例：**
  ```
  --material_sublink hint 使用 
  gaussdb=#  EXPLAIN (blockname on, costs off) SELECT max(s_acctbal) nation_total, s_nationkey
  FROM supplier WHERE s_suppkey < 10000
  GROUP BY s_nationkey having nation_total = ANY (SELECT /*+ material_sublink */ avg(s_acctbal) FROM supplier GROUP BY s_statekey);
   id |                 operation                 | Query Block 
  ----+-------------------------------------------+-------------
    1 | ->  HashAggregate                         | sel$1
    2 |    ->  Seq Scan on supplier@"sel$1"       | sel$1
    3 |    ->  Materialize  [1, SubPlan 1]        | 
    4 |       ->  HashAggregate                   | sel$2
    5 |          ->  Seq Scan on supplier@"sel$2" | sel$2
  (5 rows)
   Predicate Information (identified by plan id) 
  -----------------------------------------------
     1 --HashAggregate
           Filter: (SubPlan 1)
     2 --Seq Scan on supplier@"sel$1"
           Filter: (s_suppkey < 10000)
  (4 rows)
  ```
  可以看到对sublink进行了material操作，若不使用该hint，则会使用hashed。
  

- hashed_sublink
  **建表和准备** ：
  ```
  set work_mem='64kB';  --将work内存缩小便于复现该场景
  set explain_perf_mode = pretty;   --打开explain pretty选项，可以看到更详尽计划
  CREATE TABLE nt1 (a int);
  CREATE TABLE nt2 (a int);
  INSERT INTO nt1 VALUES(generate_series(1, 50000));
  INSERT INTO nt2 VALUES(generate_series(1, 50000));
  ```
  **示例：**
  ```
  --hashed_sublink hint 使用
  gaussdb=# EXPLAIN SELECT * FROM nt1 WHERE nt1.a NOT IN (SELECT /*+ hashed_sublink no_expand*/ a FROM nt2);
   id |               operation                | E-rows | E-width |      E-costs       
  ----+----------------------------------------+--------+---------+--------------------
    1 | ->  Seq Scan on nt1                    |  49869 |       4 | 1627.725..3255.450
    2 |    ->  Seq Scan on nt2  [1, SubPlan 1] |  99738 |       4 | 0.000..1378.380
  (2 rows)
   Predicate Information (identified by plan id) 
  -----------------------------------------------
     1 --Seq Scan on nt1
           Filter: (NOT (hashed SubPlan 1))
  (2 rows)
  --work_mem 会对计划生成执行有所影响若后续进行其他操作需要重置：
  reset work_mem;  --将内存设置回退
  ```
  可以看到对sublink进行了hashed操作，若不使用该hint，则会使用material。
  
 
