更新时间:2025-09-18 GMT+08:00

优化器方法配置

这些配置参数提供了影响查询优化器选择查询规划的原始方法。如果优化器为特定的查询选择的缺省规划并不是最优的,可以通过使用这些配置参数强制优化器选择一个不同的规划来临时解决这个问题。更好的方法包括调节优化器开销常量、手动运行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

跨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子链接中两表自链接消除为单表聚合)。

默认值:magicset、or_conversion、projection_pushdown、plain_lazyagg、subquery_qual_pull_up、not_distinct_from_opt、foreign_agg_opt