
# 优化器方法配置
以下配置参数提供了影响查询优化器选择查询规划的原始方法。如果优化器为特定的查询选择的缺省规划并不是最优的，可以通过使用这些配置参数强制优化器选择一个不同的规划来临时解决这个问题。更好的方法包括调节优化器开销常量、手动运行ANALYZE、增加配置参数default_statistics_target的值。
#### enable_bitmapscan
**参数说明**：控制优化器对位图扫描规划类型的使用。
**取值范围**：布尔型
- on表示使用。
- off表示不使用。
**默认值**：on
#### enable_hashagg
**参数说明**：控制优化器对Hash聚集规划类型的使用。
**取值范围**：布尔型
- on表示使用。
- off表示不使用。
**默认值**：on
#### enable_mixedagg
**参数说明**：控制优化器对Mixed Agg聚集规划类型的使用。
**取值范围**：布尔型
- on表示使用，为符合条件的Grouping Sets语句（包括Rollup或Cube）生成Mixed Agg查询计划。
- off表示不使用。
**默认值**：on
![](https://support.huaweicloud.com/devg-fabric/public_sys-resources/notice_3.0-zh-cn.png)
通常在大数量场景（单个DN表的数据量在100GB以上），采用Mixed Agg查询计划可以提升语句的执行性能。
不支持Mixed Agg的场景如下：
- GROUP BY子句里列的数据类型不支持哈希操作。
- 聚集函数中包含DISTINCT去重或ORDER BY排序。
- 使用GROUPING SETS子句时不包含空的分组。
 
#### enable_hashjoin
**参数说明**：控制优化器对Hash连接规划类型的使用。
**取值范围**：布尔型
- on表示使用。
- off表示不使用。
**默认值**：on
#### enable_indexscan
**参数说明**：控制优化器对索引扫描规划类型的使用。
**取值范围**：布尔型
- on表示使用。
- off表示不使用。
**默认值**：on
#### enable_indexonlyscan
**参数说明**：控制优化器对仅索引扫描规划类型的使用。
**取值范围**：布尔型
- on表示使用。
- off表示不使用。
**默认值**：on
#### enable_material
**参数说明**：控制优化器对实体化的使用。消除整个实体化是不可能的，但是可以关闭这个变量以防止优化器插入实体节点。
**取值范围**：布尔型
- on表示使用。
- off表示不使用。
**默认值**：on
#### enable_mergejoin
**参数说明**：控制优化器对融合连接规划类型的使用。
**取值范围**：布尔型
- on表示使用。
- off表示不使用。
**默认值**：off
#### enable_nestloop
**参数说明**：控制优化器对内表全表扫描嵌套循环连接规划类型的使用。完全消除嵌套循环连接是不可能的，但是关闭这个变量就会让优化器在存在其他方法的时候优先选择其他方法。
**取值范围**：布尔型
- on表示使用。
- off表示不使用。
**默认值**：off
#### left_join_estimation_enhancement
**参数说明**：控制left join的行数估计值是否采用优化后的值。该参数仅8.3.0.100及以上集群版本支持。
**取值范围**：布尔型
- on表示使用。
- off表示不使用。
**默认值**：off
#### enable_seqscan
**参数说明**：控制优化器对顺序扫描规划类型的使用。完全消除顺序扫描是不可能的，但是关闭这个变量会让优化器在存在其他方法的时候优先选择其他方法。
**取值范围**：布尔型
- on表示使用。
- off表示不使用。
**默认值**：on
#### enable_sort
**参数说明**：控制优化器使用的排序步骤。完全消除明确的排序是不可能的，但是关闭这个变量可以让优化器在存在其他方法的时候优先选择其他方法。
**取值范围**：布尔型
- on表示使用。
- off表示不使用。
**默认值**：on
#### max_opt_sort_rows
**参数说明**：控制order by子句中最大优化的limit+offset行数。该参数仅8.3.0及以上集群版本支持。
**取值范围**：整型，0～INT_MAX
- 取值为0时：表示参数不生效。
- 取值为其他值时：表示order by子句中limit+offset行数小于该值时，优化生效，大于该值时，优化不生效。优化后耗时减小，但内存消耗可能增大。
**默认值**：0
#### enable_stream_concurrent_update
**参数说明** ：控制优化器在并发更新场景下对stream的使用，该参数受限于[enable_stream_operator]参数。
**取值范围**：布尔型
- on表示允许优化器对update语句生成stream计划。
- off表示优化器对update语句仅能生成非stream计划。
**默认值**：on
#### enable_ctescan
**参数说明**：控制计划是否支持ctescan。
**取值范围**：布尔型
- on表示支持ctescan。
- off表示不支持ctescan。
**默认值**：on
 #### enable_stream_operator
**参数说明**：控制优化器对stream的使用。
**取值范围**：布尔型
- on表示使用。
- off表示不使用。
**默认值**：on
#### enable_stream_recursive
**参数说明**：控制是否将with recursive关联查询下推DN分布式执行。
**取值范围**：布尔型
- on表示支持使用with recursive关联查询下推DN分布式执行。
- off表示不支持使用with recursive下推。
**默认值**：on
#### enable_value_redistribute
**参数说明**：控制是否开启生成value redistribute优化计划，8.2.0及以上集群版本中，该参数针对不带Partition by子句的rank、dense_rank、row_number是否生成value redistribute优化计划生效。
**取值范围**：布尔型
- on表示支持使用value redistribute生成优化计划。
- off表示不支持使用value redistribute生成优化计划。
**默认值**：off
#### max_recursive_times
**参数说明**：控制with recursive的最大迭代次数。
**取值范围**：整型，0～INT_MAX。
**默认值**：200
#### enable_vector_engine
**参数说明**：控制优化器对向量化执行引擎的使用。
**取值范围**：布尔型
- on表示使用。
- off表示不使用。
**默认值**：on
#### enable_broadcast
**参数说明**：控制优化器对stream代价估算时对broadcast分布方式的使用。
**取值范围**：布尔型
- on表示使用。
- off表示不使用。
**默认值**：on
#### enable_redistribute
**参数说明**：控制优化器对stream代价估算时对local redistribute和split redistribute分布方式的使用。该参数仅8.2.1.300及以上集群版本支持。
**取值范围**：布尔型
- on表示使用。
- off表示不使用。
**默认值**：on
#### enable_change_hjcost
**参数说明**：控制优化器在Hash Join代价估算路径选择时，是否使用将内表运行时代价排除在Hash Join节点运行时代价外的估算方式。如果使用，则有利于选择条数少，但运行代价大的表做内表。
**取值范围**：布尔型
- on表示使用。
- off表示不使用。
**默认值**：off
#### enable_fstream
**参数说明**：控制优化器下发语句时对stream的使用，该参数只限定于HDFS外表使用。
该参数现在已经废弃。为了保留前向兼容，可以设置成功，但是实际不起任何作用。
**取值范围**：布尔型
- on表示使用。
- off表示不使用。
**默认值**：off
#### enable_hashfilter
**参数说明**：控制是否允许对包含复制表(包括dual表和常量表)的计划生成hashfilter。该参数仅8.2.0及以上集群版本支持。
**取值范围**：布尔型
- on表示允许生成hashfilter。
- off表示任何情况下都不允许生成hashfilter。
**默认值**：on
#### best_agg_plan
**参数说明** ：对于stream下的Agg操作，优化器会生成三种计划：
1. hashagg+gather(redistribute)+hashagg。
2. redistribute+hashagg(+gather)。
3. hashagg+redistribute+hashagg(+gather)。
 
本参数用于控制优化器生成哪种hashagg的计划。
**取值范围**：0，1，2，3
- 取值为1时，强制生成第一种计划。
- 取值为2时，如果group by列可以重分布，强制生成第二种计划，否则生成第一种计划。
- 取值为3时，如果group by列可以重分布，强制生成第三种计划，否则生成第一种计划。
- 取值为0时，优化器会根据以上三种计划的估算cost选择最优的一种计划生成。
**默认值**：0
#### turbo_engine_version
**参数说明**：对于建表指定turbo存储格式表（表属性中enable_turbo_store参数设置为on），且当查询不涉及merge join或sort agg算子时，执行器可走turbo执行引擎，执行器部分性能可获得成倍性能提升。
**取值范围**：0，1，2，3
- 取值为0时，表示turbo执行引擎关闭。
- 取值为1时，表示仅针对单表agg查询场景使用turbo执行引擎。
- 取值为2时，表示仅针对单表agg或多表join关联查询场景使用turbo执行引擎。
- 取值为3时，对于大多常用算子可使用turbo执行引擎加速，不支持算子如merge join，sort agg等算子。数据量较大且turbo_engine_version取值为3时，merge join，sort agg算子出现的情况较少，因此基本可以实现任意SQL语句的turbo执行引擎加速。
**默认值**：3
![](https://support.huaweicloud.com/devg-fabric/public_sys-resources/notice_3.0-zh-cn.png)
跨VW场景暂不建议打开turbo执行引擎。
#### spill_compression
**参数说明**：控制执行器算子运行数据由于内存不足下盘时的压缩算法。该参数仅9.1.0.100及以上集群版本支持。
**取值范围**：枚举型
- 'lz4'，表示使用lz4压缩算法，对于下盘量较小场景性能更优，但占用更多存储空间。
- 'zstd'，表示使用zstd压缩算法，对于下盘量较大场景，IO为主要瓶颈，其性能更优，且存储空间约为lz4的2/3。
**默认值**：'lz4'
#### index_selectivity_cost
**参数说明**：控制列存表索引扫描时cbtree的cost计算（选择率\>0.001），该参数仅8.2.1.1008.2.1.1及以上集群版本支持。
**取值范围**：浮点型，-1，0～1000，负数仅支持设置-1，且不允许设置其他负数。
- 取值为0时，不受索引选择率阈值0.001的影响。
- 取值为-1时，受disable_cost影响。
- 为其他值时，为cbtree cost计算的系数。
**默认值**：-1
#### index_cost_limit
**参数说明**：控制列存表索引扫描时cbtree的cost计算不生效阈值，该参数仅8.2.1.1008.2.1.1及以上集群版本支持。
**取值范围**：整型，0\~2147483647。
- 取值为0时，表示参数不生效。
- 取值为其他值时，表行数少于该值时不受索引选择率阈值0.001的影响。
**默认值**：0
#### volatile_shipping_version
**参数说明**：控制volatile函数下推执行的范围。
**取值范围**：0，1，2，3
- 取值为3时，在2的基础上，扩展支持InlineCTE在只被引用一次时支持下推，扩展支持复制表UPSERT中使用包含volatile函数时的下推。
- 取值为2时，在1的基础上，扩展支持在复制CTE结果的目标列中包含volatile函数时的下推。
- 取值为1时，扩展支持nextval、uuid_generate_v1、sys_guid、uuid函数出现在语句目标列时的完全下推。
- 取值为0时，支持random类函数的完全下推，nextval、uuid_generate_v1函数仅在INSERT含有简单查询语句的部分下推。
**默认值**：3
#### agg_redistribute_enhancement
**参数说明**：当进行Agg操作时，如果包含多个group by列且均不为分布列，进行重分布时会选择某一group by列进行重分布。本参数控制选择重分布列的策略。
**取值范围**：布尔型
- on表示会选择估算distinct值最多的一个可重分布列作为重分布列。
- off表示会选择第一个可重分布列为重分布列。
**默认值**：off
#### enable_valuepartition_pruning
**参数说明：**是否对DFS分区表进行静态/动态优化。
**取值范围：**布尔型
- on表示对DFS分区表进行静态/动态优化。
- off表示不对DFS分区表进行静态/动态优化。
**默认值：**on
#### stream_multiple
**参数说明**：设置优化器计算Stream算子的开销时的加权。
在原代价模型的基础上，最终Stream代价将被乘以此加权参数。
**取值范围**：浮点型，0～10000。
**默认值**：1
![](https://support.huaweicloud.com/devg-fabric/public_sys-resources/notice_3.0-zh-cn.png)
此参数仅对Redistribute和Broadcast类型的Stream有效。
#### enable_inlist_hashing
**参数说明**：控制是否使用inlist哈希优化。该参数仅9.1.0及以上集群版本支持。
**取值范围**：布尔型
- on表示开启inlist哈希优化。
- off表示关闭inlist哈希优化。
**默认值**：on
#### setop_optmode
**参数说明**：控制不带ALL选项的集合操作(UNION/EXCEPT/INTERSECT)语句的各个查询分支语句是否执行去重操作。该参数仅8.2.0及以上集群版本支持。
**取值范围**：枚举型
- disable：查询分支不执行去重操作。
- force：强制查询分支执行去重操作。
- cost：优化器在查询分支去重和不去重这两种执行方式中，选择代价比较小的执行方式。
**默认值**：cost
![](https://support.huaweicloud.com/devg-fabric/public_sys-resources/notice_3.0-zh-cn.png)
此参数配置仅在SQL语句的执行计划满足以下条件时生效：
- SQL语句中的UNION/EXCEPT/INTERSECT操作不带ALL选项。
- 执行集合操作的各个查询分支在进行集合操作前执行过数据重分布动作。
 
#### skew_option
**参数说明**：控制是否使用优化策略。
**取值范围**：字符串
- off：关闭策略。
- normal：采用激进策略。对于不确定是否出现倾斜的场景，认为存在倾斜，并进行相应优化。
- lazy：采用保守策略。对于不确定是否出现倾斜场景，认为不存在倾斜，不进行优化。
**默认值**：normal
#### enable_expr_skew_optimization
**参数说明**：控制是否在倾斜优化策略中使用表达式统计信息。该参数仅9.1.0.100及以上集群版本支持。
**取值范围**：布尔型
- on表示在倾斜优化策略中使用表达式统计信息来判断是否存在倾斜。
- off表示在倾斜优化策略中不使用表达式统计信息来判断是否存在倾斜。
**默认值**：on
#### prefer_hashjoin_path
**参数说明**：控制是否优先生成hashjoin路径，以便通过将代价较大的其它路径预剪枝掉的方法来提升整体计划生成时间。该参数仅8.2.1及以上集群版本支持。
**取值范围**：布尔型
- on表示启用hashjoin路径提前生成的优化。
- off表示关闭hashjoin路径提前生成的优化。
**默认值**：on
#### enable_hashfilter_test
**参数说明**：该参数用于控制是否为基表扫描增加分布列的hashfilter，以便确认结果是否符合预期。同时，在数据插入时，控制是否进行DN准确性校验（即校验当前数据是否应该插入当前DN）。
**取值范围**：布尔型
- on表示为基表扫描添加分布列的hashfilter，并在数据插入时进行DN准确性校验。
- off表示不为基表扫描添加分布列的hashfilter，并在数据插入时不进行DN准确性校验。
**默认值**：off
![](https://support.huaweicloud.com/devg-fabric/public_sys-resources/notice_3.0-zh-cn.png)
- 此参数仅对hash分布的表有效。
- 当该参数设置为on后，因在数据插入时会进行DN准确性校验，会影响数据插入性能。
 
#### enable_topk_optimization
**参数说明**：控制是否开启TopK排序优化。该参数仅9.1.0.200及以上集群版本支持。
**取值范围**：布尔型
- on表示开启TopK排序优化。
- off表示关闭TopK排序优化。
**默认值**：on
#### rewrite_rule
**参数说明**：标识开启的可选查询重写规则，在特定的场景中，通过此GUC参数对查询重写规则进行设置，使得查询效率最优。
此参数可以控制查询重写规则的组合，例如有多个重写规则：rule1、rule2、rule3、rule4。可以设置：
```
set rewrite_rule='on(rule1)';          --启用查询重写规则 rule1
set rewrite_rule='off(rule1)';          --关闭查询重写规则 rule1
set rewrite_rule='rule2,rule3';    --启用查询重写规则 rule2 和 rule3
set rewrite_rule=none;           --关闭所有可选查询重写规则
```
**取值范围**：字符串
表1取值说明 
| 取值                       | 作用                                                                            |
|:---|:---|
| none                     | 不使用任何可选查询重写规则。                                                                |
| lazyagg                  | 使用Lazy Agg查询重写规则（消除子查询中的聚集运算）。                                                |
| magicset                 | 使用Magic Set查询重写规则（从主查询中下推条件到子查询）。                                             |
| uniquecheck              | 使用Unique Check重写规则（允许目标列不含聚集函数的表达式子链接场景提升，需在子链接按关联列聚集后目标列值唯一才能开启，建议专业调优人员使用）。 |
| disablerep               | 使用禁止复制表的子链接提升规则（针对复制表禁止子链接提升）。                                                |
| notinopt                 | 使用Not In查询重写规则（将Not In转换为更高效的Hash Join）。                                      |
| or_conversion            | 使用OR查询重写规则（将包含OR的复杂谓词拆分或重写）。                                                  |
| projection_pushdown      | 使用Projection Pushdown查询重写规则。                                                  |
| plain_lazyagg            | 使用简单Lazy Agg查询重写规则（用于单个子查询和distinct操作）。                                       |
| eager_magicset           | 使用Eager Magic Set查询重写规则（允许将带有group by或partition by的子查询中的qual条件下推）。            |
| outer_join_quality_imply | 使用外连接查询重写规则（允许在外连接中从外部表向内部表传递属性）。                                             |
| inlist_merge             | 使用Inlist Merge查询重写规则（将同一列多个IN合并成一个IN(List)）。                                  |
| casewhen_simplification  | 使用CASE WHEN查询重写优化（将case when..then..else..end进行常量折叠，去除不可达分支，简化计算）。            |
| subquery_qual_pull_up    | 使用子查询上升查询重写优化（将子查询中的过滤条件提升到外层查询）。                                             |
| join_elimination         | 使用Join Elimination查询重写规则（删除对最终结果没有影响的连接）。                                     |
| not_distinct_from_opt    | 使用Not Distinct From查询重写规则（is not distinct from转换为=形式以支持hashjoin）。             |
| foreign_agg_opt          | 使用部分聚合函数查询重写优化规则（对count(1)，max，min函数，通过文件footer查结果集）。                         |
| selfjoin_elimination     | 使用自连接查询优化重写规则（对exists、any子链接中两表自链接消除为单表聚合）。                                   |
   
**默认值**：magicset、or_conversion、projection_pushdown、plain_lazyagg、subquery_qual_pull_up、not_distinct_from_opt、foreign_agg_opt
#### cte_options
**参数说明**：用来配置计划能够选择ctescan的前提条件。
**参数选项及取值**：
表2参数选项及取值说明 
| 参数名                 | 取值                                         | 作用                                             |
|:---|:---|:---|
| pred_threshold      | 整型\[0-50\]，默认值为2。                          | 设置单表使用ctescan的最小谓词数量。                          |
| max_mem             | 整型\[32-2097151\]（配置参数不可加单位，单位为MB），默认值为256。 | 设置最大估计内存，在引用计数小于ref_count_threshold时使用ctescan。 |
| ref_count_threshold | 整型\[0-50\]，默认值为4。                          | 设置最小引用计数，在估算cte内存超过max_mem时，使用共享扫描。            |
   
示例：
```
set cte_options = "(pred_threshold:2),(max_mem:256),(ref_count_threshold:4)";
```
#### analyze_mode
**参数说明**：配置analyze选项。
**取值范围**：字符串类型。
- none：无特殊配置。

- auto：开启auto-analyze。
- file_sample：开启文件级采样。
**默认值**：none
