
# 优化器方法配置
以下配置参数提供了影响查询优化器选择查询规划的原始方法。如果优化器为特定的查询选择的缺省规划并不是最优的，可以通过使用这些配置参数强制优化器选择一个不同的规划来临时解决这个问题。更好的方法包括调节优化器开销常量、手动运行ANALYZE、增加配置参数default_statistics_target的值。
#### enable_hashjoin
**参数说明**：控制优化器对Hash连接规划类型的使用。
**取值范围**：布尔型
- on表示使用。
- off表示不使用。
**默认值**：on
#### enable_nestloop
**参数说明**：控制优化器对内表全表扫描嵌套循环连接规划类型的使用。完全消除嵌套循环连接是不可能的，但是关闭这个变量就会让优化器在存在其他方法的时候优先选择其他方法。
**取值范围**：布尔型
- on表示使用。
- off表示不使用。
**默认值**：off
#### 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/sqlref-aura-aidatalake/public_sys-resources/note_3.0-zh-cn.png)
跨VW场景暂不建议打开turbo执行引擎。
#### agg_redistribute_enhancement
**参数说明**：当进行Agg操作时，如果包含多个group by列且均不为分布列，进行重分布时会选择某一group by列进行重分布。本参数控制选择重分布列的策略。
**取值范围**：布尔型
- on表示会选择估算distinct值最多的一个可重分布列作为重分布列。
- off表示会选择第一个可重分布列为重分布列。
**默认值**：off
#### skew_option
**参数说明**：控制是否使用优化策略。
**取值范围**：字符串
- off：关闭策略。
- normal：采用激进策略。对于不确定是否出现倾斜的场景，认为存在倾斜，并进行相应优化。
- lazy：采用保守策略。对于不确定是否出现倾斜场景，认为不存在倾斜，不进行优化。
**默认值**：normal
 #### 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子链接中两表自链接消除为单表聚合）。                                   |
| remove_groupby           | 使用Remove GroupBy查询重写规则（删除冗余分组列）。                                              |
| sum_opt                  | 使用sum优化查询重写规则（提取sum中的公共表达式，减少sum聚合的个数）。                                       |
   
**默认值**：magicset、or_conversion、projection_pushdown、plain_lazyagg、subquery_qual_pull_up、not_distinct_from_opt、foreign_agg_opt, selfjoin_elimination, remove_groupby, sum_opt
#### cte_options
**参数说明**：用来配置计划能够选择ctescan的前提条件，参数格式为逗号分隔的键值对，每个键值对以(key:value)形式表示。
**参数选项及取值**：
表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时，使用共享扫描。            |
   
**默认值**：(pred_threshold:2),(max_mem:256),(ref_count_threshold:4)
**示例**：
```
set cte_options = "(pred_threshold:2),(max_mem:256),(ref_count_threshold:4)";
```
#### analyze_mode
**参数说明** ：配置analyze选项。此参数可设置多个优化选项的组合，使用方法参见[rewrite_rule]说明。
**取值范围**：字符串类型。
- none：无特殊配置。

- auto：开启auto-analyze。
- file_sample：开启文件级采样。
- partition：开启分区级analyze。
**默认值**：none
#### sql_opt_options
**参数说明** ：配置SQL计划生成优化选项。此参数可设置多个优化选项的组合，使用方法参见[rewrite_rule]说明。
**取值范围**：字符串类型。
- none：无特殊配置。

- cte_scan：对于WITH子语句开启share scan。
- common_expr_reuse：对于非返回结果集表达式开启表达式复用。
- project_set：对于返回结果集函数开启表达式复用并使用project_set优化执行逻辑。
- udf_split：对于嵌套用户自定义函数，通过将函数拆分到不同算子，并使用stream算子分隔来使其并发执行。
- async_udf：对于同一层的多个用户自定义函数，通过异步执行，使其能够并发执行。
- iceberg_bucket_stream_opt：对于iceberg的bucket分区表，支持bucket aware的join，减少stream开销。
**默认值**：cte_scan，iceberg_bucket_stream_opt
