其他优化器选项
default_statistics_target
参数说明:为没有用ALTER TABLE SET STATISTICS设置字段目标的表设置缺省统计目标。此参数设置为正数是代表统计信息的样本数量,为负数时,代表使用百分比的形式设置统计目标,负数转换为对应的百分比,即-5代表5%。采样时,会将default_statistics_target * 300作为随机抽样的大小,例如默认值为100时,会随机读取30000个页面再从中随机取30000条数据来完成随机抽样。
参数类型:USERSET
取值范围:浮点型,-100~10000。
- 比默认值大的正数数值增加了ANALYZE所需的时间,但是可能会改善优化器的估计质量。
- 调整此参数可能存在性能劣化的风险,如果某个查询劣化,可以考虑
- 恢复默认的统计信息。
- 使用plan hint来调整到之前的查询计划。
- 当此guc参数设置为负数时,如果计算的采样样本数大于等于总数据量的2%,且用户表的数据量小于1600000时,ANALYZE所需时间相比guc参数为默认值的时间会有所增加。
- autoanalyze不支持临时表采样方式设置采样大小,采样过程使用参数默认值。
- 当强制使用内存方式计算统计信息时,采样大小受maintenance_work_mem参数限制。
默认值:100
random_function_version
参数说明:控制analyze在进行数据采样时选取的random函数版本。该参数仅8.1.2及以上版本支持。
参数类型:USERSET
取值范围:枚举类型
- 0 表示采用C标准库提供的random函数。
- 1 表示采用优化增强的random函数。
默认值:
- 若当前集群为低版本升级到8.2.0.100及以上集群版本,为保持和前向兼容,默认值为0。
- 若当前集群为新装的8.2.0.100及以上集群版本,默认值为1。
constraint_exclusion
参数说明:控制查询优化器使用表约束查询的优化。
参数类型:USERSET
取值范围:枚举类型
- on表示检查所有表的约束。
- off表示不检查约束。
- partition表示只检查继承的子表和UNION ALL子查询。
当constraint_exclusion为on,优化器用查询条件和表的CHECK约束比较,并且在查询条件和约束冲突的时候忽略对表的扫描。
默认值:partition
目前, constraint_exclusion缺省被打开,通常用来实现表分区。为所有的表打开它时,对于简单的查询强加了额外的规划,并且对简单查询没有什么好处。如果不用分区表,可以关掉它。
cursor_tuple_fraction
参数说明:优化器估计游标获取行数在总行数中的占比。
参数类型:USERSET
取值范围:浮点型,0.0~1.0。
比默认值小的值与使用 “fast start” 为游标规划的值相偏离,从而使得前几行恢复的很快而抓取全部的行需要很长的时间。比默认值大的值加大了总的估计的时间。在最大的值1.0处,像正常的查询一样规划游标,只考虑总的估计时间和传送第一行的时间。
默认值:0.1
from_collapse_limit
参数说明:根据生成的FROM列表的项数来判断优化器是否将把子查询合并到上层查询,如果FROM列表项个数小于等于该参数值,优化器会将子查询合并到上层查询。
参数类型:USERSET
取值范围:整型,1~INT_MAX。
比默认值小的数值将降低规划时间,但是可能生成差的执行计划。
默认值:8
join_collapse_limit
参数说明:根据得出的列表项数来判断优化器是否执行把除FULL JOINS之外的JOIN构造重写到FROM列表中。
参数类型:USERSET
取值范围:整型,1~INT_MAX。
- 设置为1会避免任何JOIN重排。这样就使得查询中指定的连接顺序就是实际的连接顺序。查询优化器并不是总能选取最优的连接顺序,高级用户可以选择暂时把这个变量设置为1,然后指定它们需要的连接顺序。
- 比默认值小的数值减少规划时间但也降低了执行计划的质量。
默认值:8
enable_from_collapse_hint
参数说明:标识是否优先以hint生效的方式重写FROM列表,其次再根据from_collapse_limit、join_collapse_limit参数进行重写。该参数仅8.2.0及以上集群版本支持。
参数类型:USERSET
取值范围:布尔型
- on表示优先以hint生效的方式重写FROM列表。
- off表示无差别重写FROM列表。
- 该参数启用时,优化器会优先以hint生效的方式重写FROM列表,但hint是否生效在计划生成后才能知道,因此有可能出现该hint不生效的情况。
- 该参数关闭时,回退到8.2.0版本之前的计划,即生成计划时不区分表是否有hint。
默认值:on
plan_mode_seed
参数说明:该参数为调测参数,目前仅支持OPTIMIZE_PLAN和RANDOM_PLAN两种。其中:OPTIMIZE_PLAN表示通过动态规划算法进行代价估算的最优plan,参数值设置为0;RANDOM_PLAN表示随机生成的plan;如果设置为-1,表示用户不指定随机数的种子标识符seed值,由优化器随机生成[1, 2147483647]范围整型值的随机数,并根据随机数生成随机的执行计划;如果用户指定guc参数值为[1, 2147483647]范围的整型值,表示指定的生成随机数的种子标识符seed,优化器需要根据seed值生成随机的执行计划。
参数类型:USERSET
取值范围:整型,-1~ 2147483647
默认值:0
- 当该参数设置为随机执行计划模式时,优化器会生成不同的随机执行计划,该执行计划可能不是最优计划。因此在随机计划模式下,会对查询性能产生影响,所以建议在升级、扩容、缩容等正常业务操作或运维过程中将该参数保持为默认值0。
- 当该参数不为0时,查询指定的plan hint不会生效。
enable_hdfs_predicate_pushdown
参数说明:标识是否启用谓词下推至原生数据层的功能。
参数类型:SUSET
取值范围:布尔型
- on表示启用谓词下推至原生数据层的功能。
- off表示不启用谓词下推至原生数据层的功能。
默认值:on
windowagg_pushdown_enhancement
参数说明:标识是否在聚集场景下启用窗口函数谓词下推增强功能。(该参数仅8.2.0及以上集群版本支持)
参数类型:SUSET
取值范围:布尔型
- on表示聚集场景启用窗口函数谓词下推增强功能。
- off表示聚集场景不启用窗口函数谓词下推增强功能。
默认值:on
implied_quality_optmode
参数说明:标识语句中等值列的条件传递优化策略。(该参数仅8.2.0及以上集群版本支持)
参数类型:SUSET
取值范围:枚举类型
- normal表示向前兼容8.1.3及以前版本,即推导出的表达式行为优化。
- negative表示推导出的表达式行为不优化。
- positive在normal的基础上增加了类型转换表达式的优化。
默认值:normal
enable_random_datanode
参数说明:标识是否允许开启复制表DN随机查找功能,复制表在每个DN存放一份完整数据,随机选取可以缓解节点压力。
参数类型:USERSET
取值范围:布尔型
- on表示允许开启复制表DN随机查找功能。
- off表示不允许开启复制表DN随机查找功能。
默认值:on
hashagg_table_size
参数说明:用于设置执行HASH AGG操作时HASH表的大小。
参数类型:USERSET
取值范围:整型,0~INT_MAX/2。
默认值:0
enable_codegen
参数说明:标识是否允许开启代码生成优化,目前代码生成使用的是LLVM优化。
参数类型:USERSET
取值范围:布尔型
- on表示允许开启代码生成优化。
- off表示不允许开启代码生成优化。
目前LLVM优化仅支持向量化执行引擎特性和SQL on Hadoop特性,在其他场景下建议关闭此参数。
默认值:on
codegen_strategy
参数说明:标识在表达式codegen化过程中所使用的代码生成优化策略。
参数类型:USERSET
取值范围:枚举类型
- partial表示当所计算表达式中即使包含部分未被codegen化的函数时,仍可借助表达式全codegen框架调用LLVM动态编译优化策略。
- pure表示当所计算表达式整体可被codegen化时,才考虑调用LLVM动态编译优化策略。
在开启代码生成优化会导致查询性能下降的场景下可以设置此参数为pure,其他场景下建议不改变此参数的默认值partial。
默认值:partial
enable_codegen_print
参数说明:标识是否允许在log日志中打印所生成的LLVM IR函数。
参数类型:USERSET
取值范围:布尔型
- on表示允许在log日志中打印IR函数。
- off表示不允许在log日志中打印IR函数。
默认值:off
codegen_cost_threshold
参数说明:由于LLVM编译生成最终的可执行机器码需要一定时间,因此只有当实际执行的代价大于编译生成机器码所需要的代码和优化后的执行代价之和时,利用代码生成才有收益。codegen_cost_threshold标识代价的阈值,当执行估算代价大于该代价时,使用LLVM优化。
参数类型:USERSET
取值范围:整型,0~INT_MAX
默认值:10000
llvm_compile_expr_limit
参数说明:用于标识编译表达式个数的阈值,当表达式个数高于该阈值时,只将阈值之内的表达式使用LLVM编译,高于阈值之外的表达式不使用LLVM编译,同时生成编译告警提示(告警提示需要在执行explain performance前SET analysis_options="on(LLVM_COMPILE)")。
参数类型:USERSET
取值范围:整型,-1~INT_MAX
默认值:500
llvm_compile_time_limit
参数说明:LLVM编译时间在执行器运行时间中的占比超过llvm_compile_time_limit所设置的阈值,说明LLVM编译时间占比过高,生成告警提示(告警提示需要在执行explain performance前SET analysis_options="on(LLVM_COMPILE)")。该参数仅8.3.0及以上集群版本支持。
参数类型:USERSET
取值范围:浮点型,0.0~1.0
默认值:0.2
enable_constraint_optimization
参数说明: 标识是否允许HDFS外表使用信息约束(Informational Constraint)优化执行计划。
参数类型:SUSET
取值范围:布尔型
- on表示允许使用信息约束优化执行计划。
- off表示不允许使用信息约束优化执行计划。
默认值:on
enable_bloom_filter
参数说明: 标识是否允许使用BloomFilter优化。
参数类型:USERSET
取值范围:布尔型
- on表示允许使用BloomFilter优化。
- off表示不允许使用BloomFilter优化。
默认值:on
适用场景:外表侧同线程包含有HDFS内外表或列存表的HASH JOIN会触发Bloom Filter。
使用限制:
- JOIN类型仅限于INNER JOIN、SEMI JOIN、RIGHT JOIN、RIGHT SEMI JOIN、RIGHT ANTI JOIN、RIGHT ANTI FULL JOIN。
- JOIN内表侧关联条件:对于HDFS内外表不能为表达式;对于列存表可以为表达式,但仅限于非JOIN层计算的表达式。
- JOIN外表侧关联条件必须为简单列关联。
- JOIN内表侧与外表侧关联条件均为简单列关联时,计划层估算必须可以去除1/3以上的数据(仅针对HDFS内外表)。
- JOIN不能包含null值关联。
- 数据类型:
- HDFS内外表字段类型支持SMALLINT、INTEGER、BIGINT、REAL/FLOAT4、DOUBLE PRECISION/FLOAT8、CHAR(n)/CHARACTER(n)/NCHAR(n)、VARCHAR(n)/CHARACTER VARYING(n)、CLOB、TEXT。
- 列存表字段类型支持SMALLINT、INTEGER、BIGINT、OID、"char"、CHAR(n)/CHARACTER(n)/NCHAR(n)、VARCHAR(n)/CHARACTER VARYING(n)、NVARCHAR2(n)、CLOB、TEXT、DATE、TIME、TIMESTAMP、TIMESTAMPTZ,其中字符类型其排序规则必须指定为"C"。
runtime_filter_type
参数说明: 标识使用的runtime filter类型,仅在打开enable_bloom_filter时生效。该参数仅9.1.0.100及以上集群版本支持。
参数类型:USERSET
取值范围:枚举类型
- All,表示应用所有场景下的runtime filter。
- Topn_filter,表示应用join场景以及带有limit的order by场景下的runtime filter。
- Bloom_filter,表示仅应用join场景下的runtime filter,且满足条件后join会生成bloom filter进行过滤。
- Min_max,表示仅应用join场景下的runtime filter,且join场景仅会生成min_max过滤器。
- None,表示不使用runtime filter,此时仅对原版bloom filter生效场景具有过滤效果。
默认值:All
适用场景:列存表的HASH JOIN外表侧带有跨本DN线程的计划类型以及列存表带有limit的order by计划类型。
使用限制:
- JOIN场景使用限制同enable_bloom_filter参数的限制。
- 带有limit的order by场景下,order by字段类型仅支持SMALLINT、INTEGER、BIGINT、"char"、CHAR(n)/CHARACTER(n)/NCHAR(n)、VARCHAR(n)/CHARACTER VARYING(n)、NVARCHAR2(n)、TEXT、DATE、TIME、TIMESTAMP、TIMESTAMPTZ,其中字符类型其排序规则必须指定为"C"。
runtime_filter_ratio
参数说明: 控制runtime filter在join场景中是否使用bloom filter进行细粒度行级过滤的阈值,仅在runtime_filter_type设置值大于等于Bloom_filter时生效。该参数仅9.1.0.100及以上集群版本支持。
参数类型:USERSET
取值范围:浮点型,0.0~1.0
默认值:0.01
- 适用场景:列存表的HASH JOIN,并且满足:内表estimate_join_rows/外表estimate_join_rows <= runtime_filter_ratio。细粒度行级过滤仅推荐在join场景下内表外表数据量差距明显时使用,不合理的runtime_filter_ratio设置可能会导致join场景性能劣化。
- 使用限制:细粒度行级过滤仅支持join字段类型为SMALLINT、INTEGER、BIGINT、FLOAT类型时使用。
enable_extrapolation_stats
参数说明: 标识是否允许基于历史统计信息使用推理估算的逻辑。使用该逻辑对于未及时收集统计信息的表可以增大估算准确的可能性,但也存在错误推理导致估算过大的可能性。
参数类型:USERSET
取值范围:布尔型
- on表示允许基于历史统计信息使用推理估算的逻辑。
- off表示不允许基于历史统计信息使用推理估算的逻辑。
默认值:
- 若当前集群为低版本升级到8.2.0.100及以上集群版本,为保持和前向兼容,默认值为off。
- 若当前集群为新装的8.2.0.100及以上集群版本,默认值为on。
autoanalyze
参数说明: 标识是否允许在生成计划的时候,对于“统计信息完全缺失”或“修改量达到analyze阈值”的表进行统计信息自动收集,当前不支持对外表触发autoanalyze,不支持对带有ON COMMIT [DELETE ROWS|DROP]选项的临时表触发autoanalyze,如需收集,需用户手动执行analyze操作。如果在auto analyze某个表的过程中数据库发生异常,当数据库正常运行之后再执行语句有可能仍提示需要收集此表的统计信息。此时需要用户对该表手动执行一次analyze操作,以同步统计信息数据。
表的修改量达到analyze阈值是指:表的修改量超过autovacuum_analyze_threshold + autovacuum_analyze_scale_factor * reltuples,其中reltuples是pg_class中记录的表的估算行数。
参数类型:SUSET
取值范围:布尔型
- on表示允许自动进行统计信息收集。
- off表示不允许自动进行统计信息收集。
默认值:on
enable_analyze_partition
参数说明: 控制是否支持对表的某个分区收集统计信息。开启该参数后,可以通过ANALYZE table_name PARTITION ( partition_name ) 收集某个分区的统计信息,查询表的这个分区上的数据时,优化器会选择使用分区统计信息。
参数类型:USERSET
取值范围:布尔型
- on表示支持对表的某个分区收集统计信息。
- off表示不支持对表的某个分区收集统计信息。
默认值:off
analyze_use_dn_correlation
参数说明:设置ANALYZE时CN是否使用DN的相关系数统计信息。该参数仅9.1.0.100及以上集群版本支持。
参数类型:USERSET
取值范围:布尔型
- on表示CN使用DN的相关系数统计信息。
- off表示CN不使用DN的相关系数统计信息。
默认值:on
analyze_predicate_column_threshold
参数说明:控制是否开启谓词列ANALYZE及限定支持的最小列数。该参数仅9.1.0.100及以上集群版本支持。
参数类型:SIGHUP
取值范围:整型,0~10000
- 0表示关闭谓词列ANALYZE,不会收集谓词列和谓词列和ANALYZE。
- 大于0表示开启谓词列收集功能,且只针对表列数大于等于此值的表进行支持。
默认值:10
enable_runtime_analyze_concurrent
参数说明:控制是否支持对一个表进行并发RUNTIME ANALYZE。该参数仅9.1.0.100及以上集群版本支持。
参数类型:USERSET
取值范围:布尔型
- on表示支持并发。
- off表示不支持并发。
默认值:on
analyze_max_columns_count
参数说明:控制ANALYZE能支持最大的列数。该参数仅9.1.0.100及以上集群版本支持。
参数类型:USERSET
取值范围:整型,-1~10000
- -1,表示不限制ANALYZE的列数。
- 大于-1,将只收集此值之前的列,超过的列不收集。
默认值:-1
query_dop
参数说明: 用户自定义的查询并行度。
参数类型:USERSET
取值范围:整型,-64-64
[1,64]:打开固定SMP功能,系统会使用固定并行度。
0:打开SMP自适应功能,系统会根据资源情况和计划特征动态为每个查询选取[1,8]之间(x86平台),[1,64]之间(鲲鹏平台)的最优的并行度。
[-64,-1]:打开SMP自适应功能,并限制自适应选取的最大并行度。
- 对于短查询为主的TP类业务中,如果不能通过CN轻量化或下发语句进行业务的调优,则生成SMP计划的时间较长,建议设置query_dop=1。对于AP类复杂语句的场景,建议设置query_dop=0。
- 在开启并行查询后,请保证系统CPU、内存、网络、I/O等资源充足,以达到良好效果。
- 为了避免用户设置不合理的过大值造成性能劣化,系统会计算出该DN可用最大CPU核数,并以此来作为query_dop的上限。如果用户设置query_dop超过4并且同时超过该上限,那么系统会重置query_dop为该上限值。
默认值:1
query_dop_ratio
参数说明: 用于当query_dop取值为0时,设置在系统中给定的最优dop基础上,调整dop的倍数。即最终dop=系统设置dop * query_dop_ratio(最小值为1,最大值为64)。当设置为1时,表示不调整。
参数类型:USERSET
取值范围:浮点型,0-64
默认值:1
debug_group_dop
参数说明:当query_dop取值为0时,针对生成的执行计划划分的以Stream算子为顶点的group,均分配统一的dop并行度。此参数用于人为指定特定group的dop进行性能调优,格式为G1,D1,G2,D2,...,其中:G1,G2为group的ID,可以从日志中获得,D1,D2为指定的dop值,可以为任意正整数。
参数类型:USERSET
取值范围:字符型
默认值:空
该参数仅供内部调优使用,不允许用户进行设置,建议保持默认值。
enable_analyze_check
参数说明: 标识是否允许在生成计划的时候,对于在pg_class中显示reltuples和relpages均为0的表,检查该表是否曾进行过统计信息收集。该参数8.1.3及以上集群版本中已废弃,为兼容历史版本功能保留该参数,设置不会生效。
参数类型:SUSET
取值范围:布尔型
- on表示允许检查。
- off表示不允许检查。
默认值:on
enable_sonic_hashagg
参数说明:标识是否依据规则约束使用基于面向列的hash表设计的Hash Agg算子。
参数类型:USERSET
取值范围:布尔型
- on表示在满足约束条件时使用基于面向列的hash表设计的Hash Agg算子。
- off表示不使用面向列的hash表设计的Hash Agg算子。
- 在开启enable_sonic_hashagg,且查询达到约束条件使用基于面向列的hash表设计的Hash Agg算子时,查询对应的Hash Agg算子内存使用通常可获得精简。但对于代码生成技术可获得显著性能提升的场景(enable_codegen打开后获得较大性能提升),对应的算子查询性能可能会出现劣化。
- 开启enable_sonic_hashagg,且查询达到约束条件使用基于面向列的hash表设计的Hash Agg算子时,在Explain Analyze/Performance的执行计划和执行信息中,算子显示为“Sonic Hash Aggregation”,而未达到该约束条件时,算子名称将显示为“Hash Aggregation”。
默认值:on
enable_sonic_hashjoin
参数说明:标识是否依据规则约束使用基于面向列的hash表设计的Hash Join算子。
参数类型:USERSET
取值范围:布尔型
- on表示在满足约束条件时使用基于面向列的hash表设计的Hash Join算子。
- off表示不使用面向列的hash表设计的Hash Join算子。
- 当前开关仅适用于Inner Join的场景。
- 在开启enable_sonic_hashjoin,查询对应的Hash Inner算子内存使用通常可获得精简。但对于代码生成技术可获得显著性能提升的场景,对应的算子查询性能可能会出现劣化。
- 开启enable_sonic_hashjoin,且查询达到约束条件使用基于面向列的hash表设计的Hash Join算子时,在Explain Analyze/Performance的执行计划和执行信息中,算子显示为“Sonic Hash Join”,而未达到该约束条件时,算子名称将显示为“Hash Join”。
默认值:on
enable_sonic_optspill
参数说明:标识是否优化sonic场景下HashJoin或者HashAgg的下盘文件个数。仅在enable_sonic_hashjoin或者 enable_sonic_hashagg开启情况下生效。
参数类型:USERSET
取值范围:布尔型
- on表示开启下盘文件数优化。
- off表示关闭下盘文件数优化。
满足sonic条件下的HashJoin或者HashAgg算子,在关闭此参数(设置为off)时每列会产生1个下盘文件。开启此参数(设置为on)时如果不同列数据类型相似,只会有1个下盘文件(最多5个文件)。
默认值:on
expand_hashtable_ratio
参数说明:控制Hash Agg和Hash Join算子执行过程中hash表的大小扩大比例。
参数类型:USERSET
取值范围:浮点型,0, 0.5~10
- 默认值设置为0时表示hash表大小会根据当前内存进行自适应扩展。
- 默认值设置为0.5~10之间时,显式的是指定hash表扩大的倍数,通常hash表越大性能越好,但会占用更多内存空间,在内存不足场景可能造成数据提前下盘,带来性能劣化。
默认值:0
plan_cache_mode
参数说明:标识在prepare语句中,选择生成执行计划的策略。
参数类型:USERSET
取值范围:枚举类型
- auto表示按照默认的方式选择custom plan或者generic plan。
- force_generic_plan表示强制走generic plan。
- force_custom_plan表示强制走custom plan。
- 此参数只对prepare语句生效,一般用在prepare语句中参数化字段存在比较严重的数据倾斜的场景下。
- custom plan是指对于preapre语句,在执行execute的时候,把execute语句中的参数嵌套到语句之后生成的计划。custom plan会根据execute语句中具体的参数生成计划,这种方案的优点是每次都按照具体的参数生成优选计划,执行性能比较好;缺点是每次执行前都需要重新生成计划,存在大量的重复的优化器开销。
- generic plan是指对于preapre语句生成计划,该计划策略会在执行execute语句的时候把参数bind到plan中,然后执行计划。这种方案的优点是每次执行可以省去重复的优化器开销;缺点是当bind参数字段上数据存在倾斜时该计划可能不是最优的,部分bind参数场景下执行性能较差。
默认值:auto
wlm_query_accelerate
参数说明:标识在短查询加速打开时,查询是否需要加速。
参数类型:USERSET
取值范围:整型,-1~1
- -1:短查询由快车道管控,长查询由慢车道管控。
- 0:查询不加速,短查询和长查询均由慢车道管控。
- 1:查询加速,短查询和长查询均由快车道管控。
默认值:-1
show_unshippable_warning
参数说明:标识是否将语句不下推的告警打印到客户端。
参数类型:USERSET
取值范围:布尔型
- on:将语句不下推的原因以WARNING打印到日志和客户端
- off:仅将语句不下推的原因以LOG打印到日志
默认值:off
hashjoin_spill_strategy
参数说明:选择hashjoin下盘策略。(该参数8.1.2及以上版本支持)
参数类型:USERSET
取值范围:整型,0~6
- 0:当内表较大且无法在数据库可用内存放下所有数据时,会将数据划分成不同的子分区,直到多次划分后无法分开且仍无法在内存放下所有数据时,尝试外表是否可以放到可用内存中建立哈希表。若外表可以放到可用内存中建立哈希表,则执行HashJoin。反之,则执行NestLoop。
- 1:当内表较大且无法在数据库可用内存放下所有数据时,会将数据划分成不同的子分区,直到多次划分后无法分开且仍无法在内存放下所有数据时,尝试外表是否可以放到可用内存中建立哈希表。如果内外表均很大,强制执行HashJoin。
- 2:当内表较大,并且多次下盘无法分开时,强制执行HashJoin。
- 3:当内表较大,并且多次下盘无法分开时,尝试外表是否可以放到数据库可用内存建立哈希表。如果内外表均很大,则报错。
- 4:当内表较大,并且多次下盘无法分开时,则报错。
- 5:当内表较大且无法在数据库可用内存放下所有数据时,如果外表数据可以放到内存中,则使用外表建立哈希表执行HashJoin。如果外表数据无法存放到内存中,则将数据划分成不同的子分区,直到内外表多次划分均无法分开时,执行NestLoop。
- 6:当内表较大且无法在数据库可用内存放下所有数据时,如果外表数据可以放到内存中,则使用外表建立哈希表执行HashJoin。如果外表数据无法存放到内存中,则将数据划分成不同的子分区,直到内外表多次划分均无法分开时,强制执行HashJoin。
- 此参数只对向量化HashJoin生效。
- 对于数据distinct值很小且数据量很大的场景,可能出现无法下盘导致使用内存过大产生内存不受控的问题。 取值0时通过尝试内外表交换或者Nestloop可以避免出现此类内存不受控问题。 执行Nestloop可能造成某些场景性能劣化。遇到此种场景,该参数可取值1、2、6强制执行HashJoin。
- 取值0对向量化Full Join不生效,行为与取值1相同。只尝试外表是否可建立哈希表,不执行NestLoop。
- 取值5和6相对于取值0和1的优势是如果内表数据量大到无法直接放于可用内存中,但是外表可以,则直接使用外表进行Hashjoin,减少后续多次下盘划分数据的时间消耗。当外表数据distinct较少时,使用外表建立哈希表可能导致性能劣化。此时可以将参数取值调整到0或者1。
默认值:0
max_streams_per_query
参数说明:控制查询计划中Stream节点的数目。(该参数仅8.1.1及以上集群版本支持)
参数类型:SUSET
取值范围:整型,-1~10000
- -1,表示查询计划中Stream节点数目无限制。
- 0~10000,表示查询计划中Stream节点数目超过设定值后报错,查询计划不会被执行。
- 此参数只控制DN上的Stream节点,不考虑CN上的Gather节点。
- 此参数不影响Explain查询计划,但是对Explain analyze和Explain performance有影响。
默认值:-1
enable_agg_limit_opt
参数说明:标识是否对select distinct col from table limit N 场景优化,其中N小于16384时生效, table为列存表。该参数仅8.2.0.101及以上集群版本支持。
参数类型:USERSET
取值范围:布尔型
默认值:on
stream_ctescan_pred_threshold
参数说明:当enable_stream_ctescan开启、CTE中仅包含单表过滤时,控制CTE中至少包含的过滤条件个数。大于等于该值时使用share scan方式执行;小于该值时将使用inline方式执行。该参数仅8.2.1及以上集群版本支持。
参数类型:SUSET
取值范围:整型,0~INT_MAX
默认值:2
stream_ctescan_max_estimate_mem
参数说明:当enable_stream_ctescan开启时,控制CTE的最大估算内存值。该参数需与stream_ctescan_refcount_threshold共同使用。当CTE的估算内存大于stream_ctescan_max_estimate_mem且引用次数小于stream_ctescan_refcount_threshold时,将使用inline方式执行;反之,则使用sharescan方式执行。该参数仅8.2.1及以上集群版本支持。
参数类型:SUSET
取值范围:整型,32 * 1024(32MB)~INT_MAX,单位KB
默认值:256MB
stream_ctescan_refcount_threshold
参数说明:当enable_stream_ctescan开启时,控制CTE的最大引用次数。该参数需与stream_ctescan_max_estimate_mem共同使用。当CTE的估算内存大于stream_ctescan_max_estimate_mem且引用次数小于stream_ctescan_refcount_threshold时,将使用inline方式执行;反之,则使用share scan方式执行。该参数仅8.2.1及以上集群版本支持。
参数类型:SUSET
取值范围:整型,0~INT_MAX
默认值:4
该参数仅在取值大于0时生效,取值为0时仅依赖stream_ctescan_max_estimate_mem控制inline行为。
inlist_rough_check_threshold
参数说明:当enable_csqual_pushdown开启时、过滤条件为IN进行rough check条件下推时,控制IN条件中值的个数的最大值。IN过滤条件中值的个数超过该参数时,将获取IN条件中值的最大/最小值进行条件下推。该参数仅8.2.0.101及以上集群版本支持。
参数类型:SUSET
取值范围:整型,0~10000
默认值:100
如果IN条件在表的单列分布列上进行,可以在DN进行值的过滤,此时IN条件中值的个数的最大值为inlist_rough_check_threshold的DN倍。
enable_array_optimization
参数说明:控制是否将IN/ANY/ALL条件生成的Array类型拆分为普通表达式执行。此优化将支持向量化执行、rough check剪枝、分区剪枝等多重优化。该参数仅8.2.1及以上集群版本支持。
参数类型:SUSET
取值范围:布尔型
- on:进行Array类型表达式的拆分优化。
- off:不进行Array类型表达式的拆分优化。
默认值:on
max_skew_num
参数说明:控制优化器允许进行重分布优化的倾斜值个数。该参数仅8.2.1及以上集群版本支持。
参数类型:SUSET
取值范围:整型,0~INT_MAX
默认值:10
enable_dict_plan
参数说明:控制优化器字典编码的总开关,即是否字典编码来加快group by、filter等查询速度。该参数仅8.3.0及以上集群支持。
参数类型:USERSET
取值范围:布尔型
- on:打开优化器字典总开关。
- off:关闭优化器字典总开关。
默认值:off
dict_plan_distinct_limit
参数说明:用于设置表的某一列的distinct值,小于等于此阈值才会构建字典编码。该参数仅8.3.0及以上集群支持。
参数类型:USERSET
取值范围:0~INT_MAX
默认值:10000
构建字典编码需同时满足dict_plan_distinct_limit和dict_plan_duplicate_ratio参数阈值。
dict_plan_duplicate_ratio
参数说明:用于设置表的某一列的重复率大小,大于等于此阈值才会构建字典编码。字典的典型场景是该列distinct很少,重复率很大。该参数仅8.3.0及以上集群支持。
参数类型:USERSET
取值范围:0.0~100,单位:百分比
默认值:90
构建字典编码需同时满足dict_plan_distinct_limit和dict_plan_duplicate_ratio参数阈值。
enable_cu_predicate_pushdown
参数说明:控制简单过滤条件是否下推到CU来过滤。该参数仅8.3.0及以上集群支持。
参数类型:USERSET
取值范围:布尔型
- on:简单过滤条件下推到CU来过滤。
- off:简单过滤条件不下推到CU来过滤。
默认值:off
字典列中的简单过滤条件指的是等值(“=”)运算、IN表达式及is (not) null。因为此过滤条件下推到存储层在CU填充VectorBatch时提前过滤,称此过滤为CU Predicate Filter。