其它优化器选项
explain_dna_file
参数说明: 指定explain_perf_mode为run,导出的csv信息的目标文件。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
- 这个参数的取值必须是绝对路径加上
.csv
格式的文件名。- 查询计划需为stream计划,才可以导出导出的csv信息的目标文件。
取值范围: 字符串
默认值: 空
explain_perf_mode
参数说明:此参数用来指定explain的显示格式。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:normal、pretty、summary、run
- normal:代表使用默认的打印格式。
- pretty:代表使用Vastbase改进后的新显示格式。新的格式层次清晰,计划包含了plan node id,性能分析简单直接。
- summary:代表是在pretty的基础上增加了对打印信息的分析。
- run:代表在summary的基础上,将统计的信息输出到csv格式的文件中,以便于进一步分析。
默认值:normal
analysis_options
参数说明: 通过开启对应选项中所对应的功能选项使用相应的定位功能,包括数据校验、性能统计等,参见取值范围中的选项说明。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
设置时,选择开启或者关闭的选项请使用
on()
或off()
包括,未被显示指定的功能选项会维持原来的值,参考格式:on(option1, option2, ...)
。取值范围: 字符串
- LLVM_COMPILE表示在开启并行执行,且explain的显示格式设置为非normal的条件下,explain显示界面中显示线程的codegen编译时间。
- HASH_CONFLICT表示在数据库节点进程的pg_log目录中的log日志中显示hash表的统计信息,包括hash表大小、hash链长、hash冲突情况。
- STREAM_DATA_CHECK表示对网络传输前后的数据进行CRC校验。
默认值: ALL,on(),off(LLVM_COMPILE、HASH_CONFLICT、STREAM_DATA_CHECK),不开启任何定位功能。
cost_param
参数说明:该参数用于控制在特定的客户场景中,使用不同的估算方法使得估算值与真实值更接近。此参数可以同时控制多种方法,与某一方法对应的位做与操作,不为0表示该方法被选择。
当cost_param & 1不为0,表示对于求不等值连接选择率时选择一种改良机制,此方法在自连接(两个相同的表之间连接)的估算中更加准确。目前,已弃用cost_param & 1 不为0时的路径,默认选择更优的估算公式;
当cost_param & 2不为0,表示求多个过滤条件(Filter)的选择率时,选择最小的作为总的选择率,而非两者乘积,此方法在过滤条件的列之间关联性较强时估算更加准确;
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:整型,0~INT_MAX
默认值:0
enable_partitionwise
参数说明:分区表连接操作是否选择智能算法。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:布尔型
- on表示选择智能算法。
- off表示不选择智能算法。
默认值:off
rewrite_rule
参数说明:标识开启的可选查询重写规则。有部分查询重写规则是可选的,开启它们并不能总是对查询效率有提升效果。在特定的客户场景中,通过此GUC参数对查询重写规则进行设置,使得查询效率最优。
此参数可以控制查询重写规则的组合,比如有多个重写规则:rule1、rule2、rule3、rule4。可以设置:
启用查询重写规则rule1。
set rewrite_rule=rule1;
启用查询重写规则rule2和rule3。
set rewrite_rule=rule2,rule3;
关闭所有可选查询重写规则。
set rewrite_rule=none;
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:字符串
- none:不使用任何可选查询重写规则。
- lazyagg:使用Lazy Agg查询重写规则(消除子查询中的聚集运算)。
- magicset : 使用Magic Set查询重写规则(从主查询中下推条件到子查询)。
- partialpush:使用Partial Push查询重写规则。
- uniquecheck:使用Unique Check查询重写规则(提升目标列中无agg的子查询语句,在执行时检查返回行数是否为1行)。
- disablerep:使用Disable Replicate查询重写规则。
- intargetlist:使用In Target List查询重写规则(提升目标列中的子查询)。
- predpushnormal:使用Predicate Push查询重写规则(下推谓词条件到子查询中)。
- predpushforce:使用Predicate Push查询重写规则(下推谓词条件到子查询中,尽可能的利用索引加速)。
- predpush:在predpushnormal和predpushforce中根据代价选择最优计划。
- rownumenhance:可以将
rownum < const
或rownum <= const
的场景转为limit常量算子。该选项仅在Vastbase G100 V2.2 Build 10(Patch No.12)及以后版本支持。默认值:magicset
enable_pbe_optimization
参数说明:设置优化器是否对以PBE(Parse Bind Execute)形式执行的语句进行查询计划的优化。
该参数属于SUPERUSER类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:布尔型
- on表示优化器将优化PBE语句的查询计划。
- off表示不使用优化。
默认值:on
enable_global_plancache
参数说明:设置是否对PBE查询的执行计划进行缓存共享,开启该功能可以节省高并发下数据库节点的内存使用。
在打开enable_global_plancache的情况下,为保证GPC生效,默认local_syscache_threshold不小于16MB。即如当前local_syscache_threshold小于16MB,则设置为16MB,如大于16MB,则不改变。
该参数属于POSTMASTER类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:布尔型
- on表示对PBE查询的执行计划进行缓存共享。
- off表示不共享。
默认值:off
enable_global_plancache不支持与vbplsql_check同时设置为on,如果同时设置为on则出现报错提示:此参数不能和vbplsql_check同时设置为on。
gpc_clean_timeout
参数说明:开启enable_global_plancache的情况下,如果共享计划列表里的计划超过gpc_clean_timeout的时间没有被使用,则会被清理掉。本参数用于控制没有使用的共享计划的保留时间。
该参数属于SIGHUP类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:整型,300~86400,单位为秒
默认值:1800,即30min
由于内部的GPC清理周期为5分钟,也就是5分钟检查清理一次,所以并非一超时就被清理,而是超时后的下一个检查周期被清理,即超时后5分钟内被清理。
enable_global_stats
参数说明: 标识当前统计信息模式,区别采用全局统计信息收集模式还是单节点统计信息收集模式,默认创建为采用全局统计信息模式。当关闭该参数时,则默认收集Vastbase第一个节点的统计信息,此时可能会影响生成查询计划的质量,但信息收集性能较优,建议客户谨慎考虑。该参数当前版本已废弃,请勿设置。
该参数属于SUPERUSER类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 布尔型
- on/true表示全局统计信息。
- off/false表示数据库节点统计信息。
默认值: on
enable_opfusion
参数说明:控制是否对简单增删改查进行优化。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
简单查询限制如下:
- 只支持indexscan和indexonlyscan,且全部WHERE语句的过滤条件都在索引上。
- 只支持单表增删改查,不支持join、using。
- 只支持行存表,不支持分区表,表不支持有触发器。
- 不支持active sql、QPS等信息统计特性。
- 不支持正在扩容和缩容的表。
- 不支持查询或者修改系统列。
只支持简单SELECT语句,例如:
SELECT c3 FROM t1 WHERE c1 = ? and c2 =10;
仅可以查询目标表的列,c1和c2列为索引列,后边可以是常量或者参数,可以使用 for update。
只支持简单INSERT语句,例如:
INSERT INTO t1 VALUES (?,10,?);
仅支持一个VALUES,VALUES里面的类型可以是常量和参数,不支持returning。
只支持简单DELETE语句,例如:
DELETE FROM t1 WHERE c1 = ? and c2 = 10;
c1和c2列为索引列,后边可以是常量或者参数。
只支持简单UPDATE语句,例如:
UPDATE t1 SET c3 = c3+? WHERE c1 = ? and c2 = 10;
c3列修改的值可以是常量和参数,也可以是一个简单的表达式,c1和c2列为索引列,后边可以是常量或者参数。
取值范围:布尔型
- on表示使用。
- off表示不使用。
默认值:on
enable_partition_opfusion
参数说明:在enable_opfusion参数打开的状态下,如果开启该参数,可以对分区表的简单查询进行查询优化,提升SQL执行性能。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:布尔型
- on表示使用。
- off表示不使用。
默认值:off
sql_beta_feature
参数说明:标识开启的可选SQL引擎Beta特性,其中包括对行数估算、查询等价估算等优化。
开启它们可以对特定的场景进行优化,但也可能会导致部分没有被测试覆盖的场景发生性能劣化。在特定的客户场景中,通过此GUC参数对查询重写规则进行设置,使得查询效率最优。
此参数可以控制SQL引擎Beta特性的组合,比如有多个Beta特性:feature1、feature2、feature3、feature4。可以设置:
启用SQL引擎Beta特性feature1。
set sql_beta_feature=feature1;
启用SQL引擎Beta特性feature2和feature3。
set sql_beta_feature=feature2,feature3;
关闭所有可选SQL引擎Beta特性。
set sql_beta_feature=none;
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:字符串
- none:不使用任何Beta优化器特性。
- sel_semi_poisson:使用泊松分布对等值的半连接和反连接选择率进行校准。
- sel_expr_instr: 使用字符串匹配的行数估算方法对instr(col, 'const') > 0、= 0、 = 1进行更准确的估算。
- param_path_gen:生成更多可能的参数化路径。
- rand_cost_opt:对小数据量表的随机读取代价进行优化。
- param_path_opt:利用表的膨胀系数优化索引analyze信息。
- page_est_opt:优化对非列存表索引analyze信息的relpages估算。
- no_unique_index_first:关闭主键索引扫描路径优先的优化。
- join_sel_with_cast_func:估算join行数的时候支持类型转换函数。
- canonical_pathkey:正则化pathkey生成置后(pathkey是指标记数据有序性键值的集合)。该参数打开之后,可能会导致带 order by 等语句,在有外连接的情况下,输出数据语义和标准不一样。
- index_cost_with_leaf_pages_only:估算索引代价时考虑索引叶子结点。
- partition_opfusion:开启分区表优化。
- a_style_coerce:开启Decode类型转换规则兼容Oracle,详见UNION,CASE和相关构造。
- plpgsql_stream_fetchall:在存储过程中for loop或cursor上执行的sql走stream场景下,开启获取所有tuple结果。
- partition_fdw_on:支持基于分区表创建postgres foreign table下的相关SQL。
- predpush_same_level:开启predpush hint控制同层参数化路径的功能。
- disable_bitmap_cost_with_lossy_pages:关闭bitmap路径代价中对lossy pages代价的计算。
- enable_plsql_smp:开启存储过程中的查询支持并行执行的功能。目前在同一时刻仅支持一条query使用并行执行,且cursor相关操作、自治事务、exception中的查询不会生成并行执行计划。
- enable_upsert_execute_gplan:pbe场景下on duplicate key update语句中update子句带有参数时设置enable_upsert_execute_gplan允许通过gplan执行。
- disable_merge_append_partition:对于分区表,禁止生成Merge Append路径。
subquery_rownumber_eq_sel:子查询以row_number列作为过滤条件时,按数据分布估算结果集行数。
仅Vastbase G100 V2.2 Build 10(Patch No.17)及以后版本支持subquery_rownumber_eq_sel功能。
默认值:canonical_pathkey
ngram_gram_size
参数说明: ngram解析器分词的长度。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 整型,1~4
默认值: 2
ngram_grapsymbol_ignore
参数说明: ngram解析器是否忽略图形化字符。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 布尔型
- on表示忽略图形化字符。
- off表示不忽略图形化字符。
默认值: off
ngram_punctuation_ignore
参数说明: ngram解析器是否忽略标点符号。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 布尔型
- on表示忽略标点符号。
- off表示不忽略标点符号。
默认值: on
default_statistics_target
参数说明:为没有用ALTER TABLE SET STATISTICS设置字段目标的表设置缺省统计目标。此参数设置为正数时,代表统计信息的样本数量;设置为负数时,代表使用百分比的形式设置统计目标,负数转换为对应的百分比,即-5代表5%。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:整型,-100~10000
比默认值大的正数数值增加了ANALYZE所需的时间,但是可能会改善优化器的估计质量。
调整此参数可能存在性能劣化的风险,如果某个查询劣化,可以考虑:
1、恢复默认的统计信息。
2、使用plan hint来调整到之前的查询计划。(详细参见使用Plan Hint进行调优)
当此guc参数设置为负数时,如果计算的采样样本数大于等于总数据量的2%,且用户表的数据量小于1600000时,ANALYZE所需时间相比guc参数为默认值的时间会有所增加。
当此guc参数设置为负数时,则autoanalyze不生效。
默认值:100
constraint_exclusion
参数说明:控制查询优化器使用表约束查询的优化。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:枚举类型
- on表示检查所有表的约束。
- off表示不检查约束。
- partition表示只检查继承的子表和UNION ALL子查询。
当constraint_exclusion为on,优化器用查询条件和表的CHECK约束比较,并且在查询条件和约束冲突的时候忽略对表的扫描。
默认值:partition
目前, constraint_exclusion缺省被打开,通常用来实现表分区。如果所有的表都打开它,对于简单的查询强加了额外的规划,并且对简单查询没有益处。如果不用分区表,可以关掉它。
cursor_tuple_fraction
参数说明:优化器估计游标获取行数在总行数中的占比。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:浮点型,0.0~1.0
比默认值小的值与使用“fast start”为游标规划的值相偏离,从而使得前几行恢复的很快而抓取全部的行需要很长的时间。比默认值大的值加大了总的估计的时间。在最大的值1.0处,像正常的查询一样规划游标,只考虑总的估计时间和传送第一行的时间。
默认值:0.1
from_collapse_limit
参数说明:根据生成的FROM列表的项数来判断优化器是否将把子查询合并到上层查询,如果FROM列表项个数小于等于该参数值,优化器会将子查询合并到上层查询。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:整型,1~INT_MAX
比默认值小的数值将降低规划时间,但是可能生成差的执行计划。
默认值:8
join_collapse_limit
参数说明:根据得出的列表项数来判断优化器是否执行把除FULL JOINS之外的JOIN构造重写到FROM列表中。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:整型,1~INT_MAX
设置为1会避免任何JOIN重排。这样就使得查询中指定的连接顺序就是实际的连接顺序。查询优化器并不是总能选取最优的连接顺序,高级用户可以选择暂时把这个变量设置为1,然后指定它们需要的连接顺序。
比默认值小的数值减少规划时间但也降低了执行计划的质量。
默认值:8
plan_mode_seed
参数说明:该参数为调测参数,目前仅支持OPTIMIZE_PLAN和RANDOM_PLAN两种。其中:
OPTIMIZE_PLAN表示通过动态规划算法进行代价估算的最优plan,参数值设置为0。
RANDOM_PLAN表示随机生成的plan。
如果设置guc参数值为-1,表示用户不指定随机数的种子标识符seed值,由优化器随机生成[1, 2147483647]范围整型值的随机数,并根据随机数生成随机的执行计划。
如果设置guc参数值为[1, 2147483647]范围的整型值,表示指定的生成随机数的种子标识符seed,优化器需要根据seed值生成随机的执行计划。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:整型,-1~ 2147483647
默认值:0
当该参数设置为随机执行计划模式时,优化器会生成不同的随机执行计划,该执行计划可能不是最优计划。因此在随机计划模式下,会对查询性能产生影响,所以建议在升级、扩容、缩容等正常业务操作或运维过程中将该参数保持为默认值0。
当该参数不为0时,查询指定的plan hint不会生效。
hashagg_table_size
参数说明:用于设置执行HASH JOIN操作时HASH表的大小。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:整型,0~INT_MAX/2
默认值:0
enable_codegen
参数说明: 标识是否允许开启代码生成优化,目前代码生成使用的是LLVM优化。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 布尔型
- on表示允许开启代码生成优化。
- off表示不允许开启代码生成优化。
目前LLVM优化仅支持向量化执行引擎特性,在其他场景下建议关闭此参数。
默认值: off
codegen_strategy
参数说明: 标识在表达式codegen化过程中所使用的代码生成优化策略。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 枚举类型
- partial表示当所计算表达式中即使包含部分未被codegen化的函数时,仍可借助表达式全codegen框架调用LLVM动态编译优化策略。
- pure表示当所计算表达式整体可被codegen化时,才考虑调用LLVM动态编译优化策略。
在开启代码生成优化会导致查询性能下降的场景下可以设置此参数为pure,其他场景下建议不改变此参数的默认值partial。
默认值: partial
enable_codegen_print
参数说明: 标识是否允许在log日志中打印所生成的LLVM IR函数。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 布尔型
- on表示允许在log日志中打印IR函数。
- off表示不允许在log日志中打印IR函数。
默认值: off
codegen_cost_threshold
参数说明: 由于LLVM编译生成最终的可执行机器码需要一定时间,因此只有当实际执行的代价大于编译生成机器码所需要的代码和优化后的执行代价之和时,利用代码生成才有收益。codegen_cost_threshold标识代价的阈值,当执行估算代价大于该代价时,使用LLVM优化。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 整型,0 ~ 2147483647
默认值: 10000
enable_bloom_filter
参数说明: 标识是否允许使用BloomFilter优化。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 布尔型
- on表示允许使用BloomFilter优化。
- off表示不允许使用BloomFilter优化。
默认值: on
enable_extrapolation_stats
参数说明: 标识对于日期类型是否允许基于历史统计信息使用推理估算的逻辑。使用该逻辑对于未及时收集统计信息的表可以增大估算准确的可能性,但也存在错误推理导致估算过大的可能性,需要对于日期类型数据定期插入的场景开启此开关。
该参数属于SUPERUSER类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 布尔型
- on表示允许基于历史统计信息使用推理估算的逻辑。
- off表示不允许基于历史统计信息使用推理估算的逻辑。
默认值: off
autoanalyze
参数说明: 标识是否允许在生成计划的时候,对于没有统计信息的表进行统计信息自动收集。对于外表和临时表,不支持autoanalyze,如果需要收集统计信息,用户需手动执行analyze操作。如果在auto analyze某个表的过程中数据库发生异常,当数据库正常运行之后再执行语句有可能仍提示需要收集此表的统计信息。此时需要用户对该表手动执行一次analyze操作,以同步统计信息数据。
该参数属于SUPERUSER类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 布尔型
- on表示允许自动进行统计信息收集。
- off表示不允许自动进行统计信息收集。
默认值: off
enable_analyze_check
参数说明: 标识是否允许在生成计划的时候,对于在pg_class中显示reltuples和relpages均为0的表,检查该表是否曾进行过统计信息收集。
该参数属于SUPERUSER类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 布尔型
- on表示允许检查。
- off表示不允许检查。
默认值: off
enable_sonic_hashagg
参数说明: 标识是否依据规则约束使用基于面向列的hash表设计的Hash Agg算子。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 布尔型
- 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”,Explain详解请参见详解。
默认值: on
enable_sonic_hashjoin
参数说明: 标识是否依据规则约束使用基于面向列的hash表设计的Hash Join算子。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 布尔型
- 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”,Explain详解请参见详解。
默认值: on
enable_sonic_optspill
参数说明: 标识是否对面向列的hash表设计的Hash Join算子进行下盘文件数优化。该参数打开时,在Hash Join算子下盘文件较多的时候,下盘文件数不会显著增加。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 布尔型
- on表示优化面向列的hash表设计的Hash Join算子的下盘文件数。
- off表示不优化面向列的hash表设计的Hash Join算子的下盘文件数。
默认值: on
log_parser_stats
参数说明:控制优化器输出parser模块的性能日志。
该参数属于SUPERUSER类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:布尔型
- on表示使用。
- off表示不使用。
默认值:off
log_planner_stats
参数说明:控制优化器输出planner模块的性能日志。
该参数属于SUPERUSER类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:布尔型
- on表示使用。
- off表示不使用。
默认值:off
log_executor_stats
参数说明:控制优化器输出executor模块的性能日志。
该参数属于SUPERUSER类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:布尔型
- on表示使用。
- off表示不使用。
默认值:off
log_statement_stats
参数说明:控制优化器输出该语句的性能日志。
该参数属于SUPERUSER类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:布尔型
- on表示使用。
- off表示不使用。
默认值:off
plan_cache_mode
参数说明:标识在prepare语句中,选择生成执行计划的策略。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:枚举类型
- auto表示按照默认的方式选择custom plan或者generic plan。
- force_generic_plan表示强制走generic plan。
- force_custom_plan表示强制走custom plan。
此参数只对prepare语句生效,一般用在prepare语句中参数化字段存在比较严重的数据倾斜的场景下。
custom plan是指对于prepare语句,在执行execute的时候,把execute语句中的参数嵌套到语句之后生成的计划。custom plan会根据execute语句中具体的参数生成计划,这种方案的优点是每次都按照具体的参数生成优选计划,执行性能比较好;缺点是每次执行前都需要重新生成计划,存在大量的重复的优化器开销。
generic plan是指对于prepare语句生成计划,该计划策略会在执行execute语句的时候把参数bind到plan中,然后执行计划。这种方案的优点是每次执行可以省去重复的优化器开销;缺点是当bind参数字段上数据存在倾斜时该计划可能不是最优的,部分bind参数场景下执行性能较差。
默认值:auto
enable_hypo_index
参数说明:控制优化器执行EXPLAIN命令时是否考虑虚拟索引。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:布尔型
- on表示使用。
- off表示不使用。
默认值:off
enable_force_vector_engine
参数说明:对于支持向量化的执行器算子,如果其子节点是非向量化的算子,通过设置此参数为on,强制生成向量化的执行计划。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:布尔型
- on表示可以向量化的算子强制生成向量化。
- off表示由向量化算子优化器决定是否向量化。
默认值:off
enable_auto_explain
参数说明:控制是否开启自动打印执行计划。该参数是用来定位慢存储过程或慢查询,只对当前连接的数据库主节点有效。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:布尔型
- on表示开启。
- off表示关闭。
默认值:off
auto_explain_level
参数说明:控制自动打印执行计划的日志等级。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:枚举型,LOG或NOTICE。NOTICE表示以提示知的形式打印出计划。
- LOG表示在日志中打印执行计划。
- NOTICE表示以提示知的形式打印出计划。
默认值:LOG
query_dop
参数说明:用户自定义的查询并行度。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:整型,1~64。打开固定SMP功能,系统会使用固定并行度。
在开启并行查询后,请保证系统CPU、内存、网络等资源充足,以达到最佳效果。
默认值: 1
enable_startwith_debug
参数说明:该参数为start with/connect by用于debug的参数,打开参数可以显示start with特性所有涉及的尾列相关信息。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:布尔型
- on表示开启。
- off表示关闭。
默认值:off
max_index_parallel_workers
参数说明:该参数用于配置索引最大并行度,当参数值为0时表示不开启并行。实际创建索引时的并行度取max_index_parallel_workers参数值和目标表本身的并行度parallel_workers值中的最小值。
取值范围: 整型,1~1024
默认值: 4
目标表本身的并行度parallel_workers由用户通过表的存储参数指定,表示创建索引时启动的bgworker线程数量,详见parallel_workers。
skewed_param_factor
参数说明: 指定选用自适应custom计划(plan_cache_mode = 'adaptive_custom_plan' 时)时的偏斜因子。行数最多的值与最少的值之间相差超过这个阈值,认为数据存在偏斜。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 2~2147483647
默认值: 10
enable_sqlbind
参数说明: 是否允许绑定SQL执行计划。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
仅Vastbase G100 V2.2 Build 10(Patch No.17)及以后版本支持此功能。
取值范围: 布尔型。
- on:如果语句有绑定的执行计划,使用该计划执行;如果语句没有绑定的执行计划,则使用原有逻辑生成执行计划。
- off:语句一律使用原有逻辑生成执行计划。
默认值: off
enable_sqlbind
参数说明: 是否允许绑定SQL执行计划。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
仅Vastbase G100 V2.2 Build 10(Patch No.17)及以后版本支持此功能。
取值范围: 布尔型。
- on:如果语句有绑定的执行计划,使用该计划执行;如果语句没有绑定的执行计划,则使用原有逻辑生成执行计划。
- off:语句一律使用原有逻辑生成执行计划。
默认值: off
enable_generated_column_prune
参数说明: 分区键是虚拟列时,是否允许查询时进行分区剪枝。
- 仅Vastbase G100 V2.2 Build 10(Patch No.17)及以后版本支持此功能。
- 分区剪枝是指优化器自动从符合过滤条件的子句里根据分区键提取出需要扫描的分区,减少扫描的数据块,从而避免全表扫描,提高性能。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
适用范围:
- 查询语句过滤条件应包含和虚拟列分区键一样的表达式;
- 不支持分区键为表达式的情况。
- 过滤条件表达式的结果类型应和生成列类型一致,可以通过显示转换来保证类型的一致性。参考示例2中的场景。
取值范围: 布尔型。
- on:分区键是虚拟列时,允许分区剪枝。
- off:分区键是虚拟列时,禁用分区剪枝。
示例1: 对比展示分区键是虚拟列时,是否启用enable_generated_column_prune的效果。
1、设置参数值为默认值off,当分区键是虚拟列时禁用分区剪枝。
set enable_generated_column_prune to default;
2、创建Range分区表,分区键为虚拟列,并插入数据。
CREATE TABLE tb1_1225917(col1 int,col2 int2 GENERATED ALWAYS AS (col1+200) stored) partition by range(col2) ( partition p1 values less than(200), partition p2 values less than(300), partition p3 values less than(maxvalue)); insert into tb1_1225917(col1) values(generate_series(1,500));
3、未启用enable_generated_column_prune时,查看查询语句的执行计划。
explain analyse select * from tb1_1225917 where col1+200=125;
返回结果如下:
QUERY PLAN --------------------------------------------------------------------------------------------------------------------------- Partition Iterator (cost=0.00..44.03 rows=11 width=6) (actual time=12.366..12.366 rows=0 loops=1) Iterations: 3 -> Partitioned Seq Scan on tb1_1225917 (cost=0.00..44.03 rows=11 width=6) (actual time=12.273..12.273 rows=0 loops=3) Filter: ((col1 + 200) = 125) Rows Removed by Filter: 500 Selected Partitions: 1..3 Total runtime: 31.827 ms (7 rows)
4、启用enable_generated_column_prune,并再次查看改语句的执行计划。
set enable_generated_column_prune=on; explain analyse select * from tb1_1225917 where col1+200=125;
返回结果如下。对比两次查询的查询计划可知:未开启参数时,查询遍历了3个子分区的数据;而启用参数后,查询仅遍历了数据所在的子分区,减少了查询消耗的时间。
QUERY PLAN ------------------------------------------------------------------------------------------------------------------------- Partition Iterator (cost=0.00..37.03 rows=11 width=6) (actual time=0.202..0.202 rows=0 loops=1) Iterations: 1 -> Partitioned Seq Scan on tb1_1225917 (cost=0.00..37.03 rows=11 width=6) (actual time=0.006..0.006 rows=0 loops=1) Filter: ((col2)::integer = 125) Selected Partitions: 1 Total runtime: 26.856 ms (6 rows)
5、清理环境。
DROP TABLE tb1_1225917; SET enable_generated_column_prune TO default;
示例2: 分区键是虚拟列时,通过显示转换使过滤条件表达式的结果类型和生成列类型保持一致。
1、设置参数值为默认值off,当分区键是虚拟列时禁用分区剪枝。
set enable_generated_column_prune to default;
2、创建Range分区表,分区键为虚拟列,并插入数据。
CREATE TABLE tb1_1225421(col1 int,col2 int8 GENERATED ALWAYS AS (col1/10) stored) partition by range(col2) ( partition p1 values less than(1), partition p2 values less than(25), partition p3 values less than(maxvalue)); insert into tb1_1225421(col1) values(generate_series(1,500));
3、未启用enable_generated_column_prune时,查看查询语句的执行计划。
explain analyze select * from tb1_1225421 where (col1/10)::int8<1;
返回结果如下:
QUERY PLAN ----------------------------------------------------------------------------------------------------------------------------- Partition Iterator (cost=0.00..13.75 rows=167 width=12) (actual time=18.608..18.827 rows=5 loops=1) Iterations: 3 -> Partitioned Seq Scan on tb1_1225421 (cost=0.00..13.75 rows=167 width=12) (actual time=11.988..11.995 rows=5 loops=3) Filter: (((col1 / 10))::bigint < 1) Rows Removed by Filter: 495 Selected Partitions: 1..3 Total runtime: 41.766 ms (7 rows)
4、启用enable_generated_column_prune,并再次查看改语句的执行计划。
set enable_generated_column_prune=on; explain analyze select * from tb1_1225421 where (col1/10)::int8<1;
返回结果如下。对比两次查询的查询计划可知:未开启参数时,查询遍历了3个子分区的数据;而启用参数后,查询仅遍历了数据所在的子分区,减少了查询消耗的时间。
QUERY PLAN ------------------------------------------------------------------------------------------------------------------------ Partition Iterator (cost=0.00..8.25 rows=5 width=12) (actual time=3.146..3.149 rows=5 loops=1) Iterations: 1 -> Partitioned Seq Scan on tb1_1225421 (cost=0.00..8.25 rows=5 width=12) (actual time=3.114..3.117 rows=5 loops=1) Filter: (col2 < 1) Selected Partitions: 1 Total runtime: 23.470 ms (6 rows)
5、清理环境。
DROP TABLE tb1_1225421; SET enable_generated_column_prune TO default;