
# 指定扫描并行度的Hint
#### 功能描述
在并行的执行计划中，指定表扫描的并行度。
#### 语法格式
```
scandop([@queryblock] table dop_num)
```
#### 参数说明
- @queryblock请参见[指定Hint所处于的查询块Queryblock](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/gaussdb-42-0295.html#ZH-CN_TOPIC_0000002527988096)，可省略，表示在当前查询块生效。
- table表示hint指定的表，只能指定一个表，如果表存在别名应优先使用别名进行hint。
- dop_num表示使用表扫描的并行度。
- scandop指定扫描并行度的hint。
 
#### 示例
```
--准备
CREATE TABLE cst1(a int, b int, c int, d bigint);
set explain_perf_mode = pretty;  --打开explain pretty选项，可以看到更详尽计划
--使用
gaussdb=# EXPLAIN (costs off) SELECT /*+ Set(query_dop 2) scandop(cst1 2)*/ * FROM cst1;
 id |                 operation                  
----+--------------------------------------------
  1 | ->  Streaming(type: LOCAL GATHER dop: 1/2)
  2 |    ->  Seq Scan on cst1
(2 rows)
```
可以在并行计划中，使用scandop hint可以成功指定扫描并行度。
![](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
只有当dop_num和当前并行度（query_dop）一致或为1时，hint才会生效。
```
gaussdb=# EXPLAIN (costs off) SELECT /*+ Set(query_dop 2) scandop(cst1 4)*/ * FROM cst1;
 id |      operation       
----+----------------------
  1 | ->  Seq Scan on cst1
(1 row)
```
对于一些带有子查询的场景，Stream算子会退化消除。此时scandop的hint虽然生效，但是不会生成stream计划。
```
gaussdb=# EXPLAIN(costs off) SELECT /*+ Set(query_dop 2) scandop(cst1 2) */ count(a) FROM cst1 WHERE b > (SELECT max(a) FROM cst1 ORDER BY c LIMIT 1);
 id |                 operation                  
----+--------------------------------------------
  1 | ->  Aggregate
  2 |    ->  Aggregate
  3 |       ->  Seq Scan on cst1
  4 |    ->  Limit  [3, InitPlan 1 (returns $0)]
  5 |       ->  Aggregate
  6 |          ->  Seq Scan on cst1
(6 rows)
 Predicate Information (identified by plan id) 
-----------------------------------------------
   3 --Seq Scan on cst1
         Filter: (b > $0)
(2 rows)
```
对比不带hint的计划。
```
id |                 operation                  
----+--------------------------------------------
  1 | ->  Aggregate
  2 |    ->  Seq Scan on cst1
  3 |    ->  Limit  [2, InitPlan 1 (returns $0)]
  4 |       ->  Aggregate
  5 |          ->  Seq Scan on cst1
(5 rows)
 Predicate Information (identified by plan id) 
-----------------------------------------------
   2 --Seq Scan on cst1
         Filter: (b > $0)
(2 rows)
```
可以看到带scandop hint的计划多了一个Aggregate算子，这是Stream算子消除后的残留。
普通计划只有一层Aggregate算子，两种计划不影响最终结果。
