查询调优(QUERY TUNING)类别参数
本文档介绍了系统配置参数中 查询调优类别的相关参数。
注意!
为确保系统稳定与安全,请务必谨慎手动修改相关参数。
查询调优参数分类如下:
- Postgres 查询优化器运算符控制参数
- Postgres 查询优化器代价计算参数
- Postgres 遗传查询优化配置参数
- 数据库统计采样参数
- 排序操作符配置参数
- 聚集操作符配置参数
- 连接操作符配置参数
- 其他 Postgres 查询优化器配置参数
- 查询计划执行
- JIT(Just in Time) 配置参数
- Greenplum ORCA 优化器配置参数
- Runtime Filter 优化技术配置参数
- 向量化执行引擎配置参数
Postgres 查询优化器运算符控制参数
此部分配置参数提供了影响查询优化器选择查询计划的原始方法。
如果优化器为特定的查询选择的缺省规划并不是最优,那么我们就可以通过使用这些配置参数强制优化器选择一个更好的规划来暂时解决这个问题。
提高优化器选择的计划质量的更好的方式包括:调整规划器的代价参数(见下文)、手工运行 ANALYZE
、增加 default_statistics_target
配置参数的值以及使用 ALTER TABLE SET STATISTICS
语句增加为特定列收集的统计信息量。
enable_bitmapscan
启用或禁用 Postgres 查询优化器(规划器)使用位图扫描计划类型。
- 注意:这与位图索引扫描不同。位图扫描意味着索引将在适当的时候在内存中动态转换为位图,从而在针对超大表的复杂查询上能够提供更快的索引性能。当不同的索引列上有多个谓词时会使用到它。可以比较每列的每个位图以创建所选元组的最终列表。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
enable_groupagg
启用或禁用 Postgres 查询优化器(规划器)使用组聚集计划类型。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
enable_hashagg
启用或禁用 Postgres 查询优化器(规划器)使用哈希聚合计划类型。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
enable_hashjoin
启用或禁用 Postgres 查询优化器(规划器)使用哈希连接计划类型。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
enable_indexonlyscan
启用或禁用 Postgres 查询优化器(规划器)仅使用索引扫描计划类型。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
enable_indexscan
启用或禁用 Postgres 查询优化器(规划器)使用索引扫描计划类型。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
enable_mars2aggscan
是否开启 MARS2 aggscan。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
enable_material
启用或者禁用 Postgres 查询优化器(规划器)使用物化。
- 它不可能完全禁用物化,但是关闭这个变量将阻止规划器插入物化节点,除非有需要保证正确性的情况。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
enable_mergejoin
启用或禁用 Postgres 查询优化器(规划器)使用合并连接计划类型。
- 合并连接基于将左侧和右侧表按顺序排序然后并行扫描的想法。因此,两种数据类型必须能够完全排序,并且连接运算符必须是一个只能将排序顺序中“同一位置”的值对连接成功的运算符。实际上,这意味着连接运算符的行为必须与相等一样。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
enable_nestloop
启用或禁用 Postgres 查询优化器(规划器)使用嵌套循环连接计划。
- 不可能完全抑制嵌套循环连接,但如果有其他可用方法,那么关闭此变量可阻止 Postgres 优化器使用它。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
enable_parallel_append
启用或禁用 Postgres 查询优化器(规划器)使用并行追加计划类型。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
enable_parallel_hash
启用或禁用 Postgres 查询优化器(规划器)对并行哈希使用哈希连接计划类型。
- 如果哈希连接计划没有启用,则这个参数没有效果。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
enable_partition_pruning
启用或禁用 Postgres 查询优化器(规划器)从查询计划中减少分区表的分区的能力。
- 这同样控制了 Postgres 优化器创建允许执行引擎在执行查询期间移除(忽略)分区的查询计划的能力,详见分区剪枝。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
enable_partitionwise_aggregate
启用或禁用 Postgres 查询优化器(规划器)使用面向分区的分组或聚集。
- 这使得在分区表上的分组或聚集可以在每个分区上分别执行。
- 如果
GROUP BY
子句不包括分区键,那么只有部分聚集能够以基于每个分区的方式执行。同时必须稍后再执行 finalization。 - 由于面向分区的分组或聚集在规划期间会使用大量的 CPU 时间和内存,默认值为
off
。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | off | master;session;reload |
enable_partitionwise_join
启用或禁用 Postgres 查询优化器(规划器)使用面向分区的连接。
- 这使得分区表之间的连接以连接匹配的分区的方式来执行。面向分区的连接当前只适用于连接条件包括所有分区键的情况,连接条件必须是相同的数据类型并且子分区集合要完全匹配。
- 由于面向分区的连接规划在规划期间会使用大量的 CPU 时间和内存,所以默认值为
off
。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | off | master;session;reload |
enable_seqscan
启用或禁用 Postgres 查询优化器(规划器)使用顺序扫描计划类型。
- 不可能完全抑制顺序扫描,但如果有其他方法可用,则关闭此变量可阻止 Postgres 优化器使用。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
enable_sort
启用或禁用 Postgres 查询优化器(规划器)使用显式排序步骤。
- 完全禁止显式排序是不可能的,但如果有其他可用方法,则关闭此变量可阻止 Postgres 优化器使用。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
enable_tidscan
启用或禁用Postgres查询优化器(规划器)使用元组标识符(TID)扫描计划类型。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
gp_enable_agg_distinct
启用或禁用两阶段聚合以计算单个不同限定的聚合。
- 这仅适用于包含单个不同限定聚合函数的子查询。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
gp_enable_agg_distinct_pruning
启用或禁用三阶段聚合和连接以计算不同限定的聚合。
- 这仅适用于包含一个或多个不同限定聚合函数的子查询。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
gp_enable_direct_dispatch
启用或禁用为访问单个 Segment 上的数据的查询调度目标查询计划.
- 启用时,单个 Segment 上的目标行的查询将仅将其查询计划分派到该 Segment(而不是所有 Segment)。这明显缩短了限定查询的响应时间,因为没有涉及互连设置。
- 直接分发确实需要 Master 服务器上更多的 CPU 利用率。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;system;restart |
gp_enable_fast_sri
当设置为 on
时,Postgres 查询优化器(规划器)计划单行插入,以便将它们直接发送到正确的 Segment 实例(无需 motion 操作)。
- 这显着提高了单行插入语句的性能。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
gp_enable_multiphase_agg
启用或禁用使用两阶段或三阶段并行聚合计划 Postgres 查询优化器。
- 此方法适用于具有聚合的任何子查询。如果
gp_enable_multiphase_agg
关闭,则禁用gp_enable_agg_distinct
和gp_enable_agg_distinct_pruning
。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
gp_enable_preunique
为 SELECT DISTINCT
查询启用两阶段重复删除(不是 SELECT COUNT(DISTINCT)
)。
- 启用后,它会在移动之前添加一组额外的
SORT DISTINCT
计划节点。 - 在不同操作大大减少行数的情况下,这个额外的
SORT DISTINCT
比通过互连发送行的成本代价低得多。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
gp_enable_relsize_collection
如果表没有统计信息,则允许 Greenplum GPORCA 优化器和 Postgres 查询优化器(规划器)使用表的估计大小(pg_relation_size
函数)。
- 默认情况下,如果统计信息不可用,Greenplum GPORCA 优化器和计划程序将使用默认值来估计行数。
- 默认行为可以改善查询优化时间并减少繁重工作负载中的资源队列使用,但可能导致计划不理想。
- 对于分区表的根分区,将忽略此参数。
- 启用此优化器且根分区没有统计信息时,将始终使用默认值。 你可以使用
ANALZYE ROOTPARTITION
收集根分区的统计信息。详见 ANALYZE。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | off | master;session;reload |
gp_enable_sort_distinct
在排序时启用删除重复项。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
gp_enable_sort_limit
在排序时启用 LIMIT
操作。 当计划至多需要行的第一个 limit_number
时,排序更有效。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
gp_selectivity_damping_for_joins
抑制连接(Join)子句中的选择性。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | off | master;session;reload |
gp_selectivity_damping_for_scans
抑制相同基础表中子句中的选择性。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
min_parallel_index_scan_size
为必须扫描的索引数据量设置一个最小值(BLOCKS),扫描的索引数据量超过这一个值时才会考虑使用并行扫描。
- 注意并行索引扫描通常并不会触及整个索引,它是优化器认为该扫描会实际用到的相关页面的数量。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 512 | 0 ~ (INT_MAX/3) | master;session;reload |
min_parallel_table_scan_size
为必须扫描的表数据量设置一个最小值(BLOCKS),扫描的表数据量超过这一个值才会考虑使用并行扫描。
- 对于并行顺序扫描,被扫描的表数据量总是等于表的尺寸,但是在使用索引时,被扫描的表数据量通常会更小。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 8192 | 0 ~ (INT_MAX/3) | master;session;reload |
parallel_leader_participation
允许领导者进程执行 Gather 和 Gather Merge 节点之下的查询计划而不是等待工作者进程。
- 将这个值设置为
off
会降低工作者由于领导者读取元组速度不够快而被阻塞的可能性,但是要求领导者在产生第一个元组之前等待工作者进程启动。 - 领导者能够帮助或者阻碍性能的程度取决于计划的类型、工作者的数量以及查询时长。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;system;restart |
Postgres 查询优化器代价计算参数
注意!
请勿调整此部分参数。因为它们的变动会影响 YMatrix 数据库硬件配置及典型的工作负载(workloads)。所有这些参数都是相关的,仅改变其中一个的值而不顾其连带影响会导致查询性能损耗。
cpu_index_tuple_cost
设置 Postgres 优化器(规划器)对一次索引扫描中处理每一个索引项的代价估计。这是作为顺序页面提取代价的一部分来衡量的。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
floating point | 0.005 | 0 ~ DBL_MAX | master;session;reload |
cpu_operator_cost
设置 Postgres 优化器(规划器)对于 WHERE
语句中处理每个操作符的代价估计。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
floating point | 0.0025 | 0 ~ DBL_MAX | master;session;reload |
cpu_tuple_cost
设置 Postgres 优化器(规划器)对一次查询中处理每一行(元组)的代价估计。这是作为顺序页面提取代价的一部分来衡量的。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
floating point | 0.01 | 0 ~ DBL_MAX | master;session;reload |
cursor_tuple_fraction
设置 Postgres 查询优化器(规划器)对将被检索的一个游标的行的比例的估计。
- 更小的值使得规划器偏向为游标使用“快速开始”计划,它将很快地检索前几行但是可能需要很长时间来获取所有行。更大的值强调总的估计时间。
- 最大设置为
1.0
,游标将和普通查询完全一样地被规划,只考虑总估计时间而不考虑前几行会被多快地返回。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
floating point | 0.1 | 0.0 ~ 1.0 | master;session;reload |
effective_cache_size
设置 Postgres 优化器(规划器)对一个单一查询可用的有效磁盘缓冲区尺寸(BLOCKS)的假设。
- 这个参数会被考虑在使用一个索引的代价估计中,更高的数值会使得索引扫描更可能被使用,更低的数值会使得顺序扫描更可能被使用。
- 在设置这个参数时,你还应该考虑 YMatrix 的共享缓冲区以及将被用于 YMatrix 数据文件的内核磁盘缓冲区,尽管有些数据可能在两个地方都存在。
- 另外,还要考虑预计在不同表上的并发查询数目,因为它们必须共享可用的空间。
- 这个参数对 YMatrix 分配的共享内存尺寸没有影响,它也不会保留内核磁盘缓冲,它只用于估计的目的。系统也不会假设在查询之间数据会保留在磁盘缓冲中。
gpconfig
工具和SHOW
命令以 “MB” 或 “kB” 为单位显示有效的高速缓存大小值。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 524288 | 1 ~ INT_MAX | master;session;reload |
gp_appendonly_random_page_cost
设置优化器对从 AO 表中非顺序获取磁盘页面的成本的估计。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
floating point | 40.0 | 0 ~ DBL_MAX | master;session;reload |
gp_compressed_random_page_cost
设置优化器对从压缩的 AO 表中非顺序获取磁盘页面的成本的估计。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
floating point | 400.0 | 0 ~ DBL_MAX | master;session;reload |
gp_motion_cost_per_row
设置 Motion 运算符的 Postgres 查询优化器(规划器)成本估算,以将行从一个 Segment 传输到另一个 Segment,以连续页面提取成本的小数部分来衡量。
- 如果为
0
,则使用的值是cpu_tuple_cost
值的两倍。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
floating point | 0.0 | 0 ~ DBL_MAX | master;session;reload |
gp_segments_for_planner
设置 Postgres 查询优化器(规划器)在其成本和大小估计中假设的 Primary 实例数。
- 如果为
0
,则使用的值是 Primary 的实际数量。 - 此变量影响优化器对 Motion 运算符中每个发送和接收过程处理的行数的估计。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 0 | 0 ~ INT_MAX | master;session;reload |
parallel_setup_cost
设置 Postgres 优化器(规划器)对启动并行工作者进程的代价估计。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
floating point | 1000.0 | 0 ~ INT_MAX | master;session;reload |
parallel_tuple_cost
设置 Postgres 优化器(规划器)对于从一个并行工作者进程传递一个元组给另一个进程的代价估计。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
floating point | 0.1 | 0 ~ DBL_MAX | master;session;reload |
random_page_cost
设置 Postgres 查询优化器(规划器)的非顺序读取磁盘页面的成本估计。
- 通过把表和索引放在一个特殊的表空间(Tablespace)(要设置该表空间的同名参数)中可以覆盖这个值。
- 较高的值(相对于
seq_page_cost
)将导致系统更倾向于顺序扫描,较低的值将导致系统更倾向于索引扫描。你可以一起提高或降低这两个参数来改变磁盘 I/O 代价相对于 CPU 代价的重要性。 - 对磁盘存储的随机访问通常比顺序访问要昂贵不止四倍。但是,由于对磁盘的大部分随机访问(例如被索引的读取)都被假定在高速缓冲中进行,所以使用了一个较低的默认值(4)。默认值可以被想成把随机访问建模为比顺序访问慢 40 倍,而期望 90% 的随机读取会被缓存。
- 如果你相信 90% 的缓冲率对你的负载是一个不正确的假设,你可以增加
random_page_cost
来更好的反映随机存储读取的真正代价。相应地,如果你的数据可以完全放在高速缓存中(例如当数据库小于服务器总内存时),降低random_page_cost
可能是合适的。为具有很低的随机读取代价的存储(例如固态驱动器)采用较低的random_page_cost
值可能更好。
注意!
虽然允许你将random_page_cost
设置的比seq_page_cost
小,但是物理上的实际情况并不受此影响。当所有数据库都位于内存中时,两者设置为相等是非常合理的,因为在此情况下,乱序抓取并不比顺序抓取开销更大。同样,在缓冲率很高的数据库上,你应当相对于 CPU 开销同时降低这两个值,因为获取内存中的页比通常情况下的开销小许多。如果数据库整个缓存在 RAM 中,将它们设置为相等是有意义的,因为在此情况下,不按顺序访问页面是没有的额外代价的。同样,在一个高度缓存化的数据库中,你应该相对于 CPU 参数降低这两个值,因为获取一个已经在 RAM 中的页面的代价要远小于通常情况下的代价。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
floating point | 4.0 | 0 ~ DBL_MAX | master;session;reload |
seq_page_cost
设置 Postgres 查询优化器(规划器)计算一次顺序磁盘页面抓取的开销。
- 通过设置同名的表空间(Tablespace)参数,此值可以重写为一个特定的表空间。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
floating point | 1.0 | 0 ~ DBL_MAX | master;session;reload |
Postgres 遗传查询优化配置参数
GEQO 是一个使用探索式搜索算法进行查询规划的算法。它可以降低复杂查询(需要进行多表连接的查询)的规划时间,但是代价是其产生的计划某些时候会不如使用穷举搜索算法找到的计划。
geqo
允许或禁止遗传查询优化。
- 在生产环境中通常最好不要关闭它。
geqo_threshold
变量提供了对 GEQO 更细粒度的空值。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | off | master;session;reload |
geqo_effort
控制 GEQO 里规划时间和查询规划的有效性之间的平衡。
- 参数值增加,意味着查询规划时间增加,但同时也会提高选中更有效的查询规划的几率。
geqo_effort
实际并不直接做任何事情;它只是被用来计算其他影响 GEQO 行为的变量的默认值。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 0 | 0 ~ INT_MAX | master;session;reload |
geqo_generations
控制 GEQO 使用的子代数目。
- 子代意为算法的迭代次数。它必须至少是
1
,有用的值范围和池大小相同。 - 如果设置为
0
(默认值),那么 YMatrix 将基于geqo_pool_size
选取合适的值。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 0 | 0 ~ INT_MAX | master;session;reload |
geqo_pool_size
控制 GEQO 使用的池尺寸,它就是遗传种群中的个体数目。
- 如果它被设置为 0(默认值)则会基于
geqo_effort
和查询中表的数量选择一个合适的值。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 0 | 0 ~ INT_MAX | master;session;reload |
geqo_seed
控制 GEQO 使用的随机数生成器的初始值,随机数生成器用于在连接顺序搜索空间中选择随机路径。
- 该值可以从
0
(默认值)到1
。变化该值会改变被探索的连接路径集合,并且可能导致找到一个更好或更差的路径。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
floating point | 0.0 | 0.0 ~ 1.0 | master;session;reload |
geqo_selection_bias
控制 GEQO 使用的选择偏好。
- 选择偏好是种群内的选择压力。值可以是 1.5 到 2.0 之间,后者是默认值。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
floating point | 1.0 | 0.0 ~ 100.0 | master;session;reload |
geqo_threshold
只有当涉及的 FROM
项数量至少有此参数值的时候,才使用遗传查询优化(注意一个 FULL OUTER JOIN
只被计为一个 FROM
项)。
- 对于更简单的查询,通常会使用普通的穷举搜索规划器,但是对于有很多表的查询穷举搜索会花很长时间,通常比执行一个次优的计划带来的代价还要大。因此,在查询尺寸上的一个阈值是管理 GEQO 使用的一种便捷方法。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 12 | 2 ~ INT_MAX | master;session;reload |
数据库统计采样参数
这部分参数用于调整 ANALYZE
操作采样的数据量。调整这部分参数会影响整个系统的统计数据收集。你可使用 ALTER TABLE SET STATISTICS
子句配置某些特定表和列的统计数据收集。
default_statistics_target
为没有通过 ALTER TABLE SET STATISTICS
设置列相关目标的表列设置默认统计目标。
- 更大的值增加了
ANALYZE
的时间,但是会改善 Postgres 查询优化器的估计质量。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 100 | 0 ~ 10000 | master;session;reload |
排序操作符(Sort)配置参数
gp_enable_sort_limit
在排序时启用 LIMIT
操作。 当计划至多需要行的第一个 limit_number
时,排序更有效。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
聚集操作符(Agg)配置参数
gp_enable_agg_distinct
启用或禁用两阶段聚合以计算单个不同限定的聚合。
- 这仅适用于包含单个不同限定聚合函数的子查询。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
gp_enable_agg_distinct_pruning
启用或禁用三阶段聚合和连接以计算不同限定的聚合。
- 这仅适用于包含一个或多个不同限定聚合函数的子查询。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
gp_enable_multiphase_agg
启用或禁用使用两阶段或三阶段并行聚合计划 Postgres 查询优化器。
- 此方法适用于具有聚合的任何子查询。如果
gp_enable_multiphase_agg
关闭,则禁用gp_enable_agg_distinct
和gp_enable_agg_distinct_pruning
。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
gp_enable_preunique
为 SELECT DISTINCT
查询启用两阶段重复删除(不是 SELECT COUNT(DISTINCT)
)。
- 启用后,它会在移动之前添加一组额外的
SORT DISTINCT
计划节点。 - 在不同操作大大减少行数的情况下,这个额外的
SORT DISTINCT
比通过互连发送行的成本代价低得多。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
gp_workfile_compression
指定在哈希聚合或哈希连接操作溢出到磁盘时创建的临时文件是否压缩。
- 如果你的数据库安装使用串行 ATA(SATA)磁盘驱动器,则启用压缩可能有助于避免使用 I/O 操作而使磁盘子系统过载的情况。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | off | master;session;reload |
mx_pullup_agg_proj_and_qual
提取投影字段并将 agg 评估到单独的结果节点。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | off | segments;session;reload |
连接操作符(Join)配置参数
join_collapse_limit
如果得出的列表中不超过这么多项,那么 Postgres 优化器(规划器)将把显式 JOIN
(除了 FULL JOIN
)结构重写到 FROM
项列表中。
- 较小的值可减少规划时间,但是可能会生成差些的查询计划。
- 默认情况下,这个变量被设置成和
from_collapse_limit
相同,适合大多数情况。 - 把它设置为
1
可防止对内部 JOIN 进行任何的重排序。因此查询中指定的显式连接顺序就是关系被连接的实际顺序。 - 将此变量设置为介于
1
和from_collapse_limit
之间的值可能有助于将规划时间与所选计划的质量进行权衡(更高的值会产生更好的计划)。 - 将这个值设置为
geqo_threshold
或更大,可能触发使用 GEQO 规划器,从而产生非最优计划。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 20 | 1 ~ INT_MAX | master;session;reload |
gp_adjust_selectivity_for_outerjoins
在外连接上启用 NULL 测试的选择性。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
gp_hashjoin_tuples_per_bucket
设置 HashJoin 操作使用的哈希表的目标密度。
- 较小的值往往会产生较大的哈希表,这可以提高连接性能。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 5 | 1 ~ 25 | master;session;reload |
gp_workfile_compression
指定在哈希聚合或哈希连接操作溢出到磁盘时创建的临时文件是否压缩。
- 如果你的数据库安装使用串行 ATA(SATA)磁盘驱动器,则启用压缩可能有助于避免使用 I/O 操作而使磁盘子系统过载的情况。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | off | master;session;reload |
其他 Postgres 查询优化器配置参数
constraint_exclusion
控制查询 Postgres 优化器(规划器)对表约束的使用,以优化查询。
- 此参数的支持选项有:
on
(对所有表检查约束)、off
(从不检查约束)和partition
(只对继承的子表和UNION ALL
子查询检查约束)。partition
是默认设置。它通常与传统的继承树一起使用来提高性能。 - 当对一个特定表允许这个参数,优化器比较查询条件和表的
CHECK
约束,并且忽略那些条件与约束相矛盾的扫描表。例如:=# CREATE TABLE parent(key integer, ...); =# CREATE TABLE child1000(check (key between 1000 and 1999)) INHERITS(parent); =# CREATE TABLE child2000(check (key between 2000 and 2999)) INHERITS(parent); ... =# SELECT * FROM parent WHERE key = 2400;
在启用约束排除时,这个
SELECT
将完全不会扫描child1000
,从而提高性能。 - 目前,约束排除只在通过继承树实现表分区的情况中被默认启用。为所有表启用它会增加额外的规划开销,特别是在简单查询上并且不会产生任何好处。如果没有用传统继承树分区的表时,最好是完全关闭它。(注意:分区表的等效特性是由单独的参数(
enable_partition_pruning
)控制的)
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
enum | on | true / false / yes / no / 1 / 0 / on / off / partition | master;session;reload |
force_parallel_mode
允许为测试目的使用并行查询,即便是并不期望在性能上得到效益。
- 支持选项有:
off
(只在期望改进性能时才使用并行模式)、on
(只要查询被认为是安全的,就强制使用并行查询)以及regress
(和on
相似,但是有如下文所解释的额外行为改变)。 - 更具体地说,把这个值设置为
on
会在任何一个对于并行查询安全的查询计划顶端增加一个 Gather 节点,这样查询会在一个并行工作者内部运行。即便当一个并行工作者不可用或者不能被使用,启动子事务等在并行查询上下文中被禁止的操作也将被禁止,除非优化器相信这样做会导致查询失败(则不会禁止)。当这个选项被设置时如果出现失败或者意料之外的结果,查询使用的某些函数可能需要被标记为PARALLEL UNSAFE
(或者PARALLEL RESTRICTED
)。 - 把这个值设置为
regress
具有设置成on
所有相同的效果,外加一些有助于自动回归测试的额外的效果。一般来说,来自于一个并行工作者的消息会有一个提示行指出这一点,但是设置为regress
会消除这一行,这样输出就和非并行执行完全一样。同样,被这个设置加到计划上的 Gather 节点在EXPLAIN
输出终会被隐藏起来,这样产生的输出匹配设置为off
时产生的输出。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
enum | off | on / off / regress | master;session;reload |
from_collapse_limit
如果生成的 FROM
列表不超过此参数值,Postgres 查询优化器(规划器)会将子查询合并到上层查询中。
- 较小的值会减少规划时间,但可能会产生较差的查询计划。
- 将这个值设置为
geqo_threshold
或更大,可能触发使用 GEQO 规划器,从而产生非最优计划。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 20 | 1 ~ INT_MAX | master;session;reload |
gp_enable_predicate_propagation
启用后,Postgres 查询优化器(规划器)会在表格在其分布键列上连接的情况下将查询谓词应用于两个表表达式。
- 在进行连接之前过滤两个表(如果可能)更有效。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
gp_max_plan_size
指定查询执行计划的最大未压缩总大小乘以计划中的 Motion 运算符(切片)数。
- 如果查询计划的大小超过该值,则取消查询并返回错误。
- 值为
0
表示不监视计划的大小。 - 你可以指定以 kB,MB 或 GB 为单位的值。默认单位是 kB。例如,值
200
是200kB
。 值1GB
与1024MB
或1048576kB
相同。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 0 | 0 ~ (INT_MAX/1024) | master;session;superuser |
gp_statistics_pullup_from_child_partition
在 Postgres 查询优化器(规划器)规划父表的查询时,允许使用子表中的统计信息。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | off | master;session;reload |
gp_statistics_use_fkeys
启用后,允许 Postgres 查询优化器(规划器)使用存储在系统目录中的外键信息来优化外键和主键之间的连接。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | off | master;session;reload |
查询计划执行
gp_max_slices
指定可以由查询生成的最大切片数(在 Segment 实例上执行的查询计划的部分)。
- 如果查询生成的切片数超过指定数量,则 YMatrix 数据库将返回错误并且不执行查询。
- 默认值为 0,没有最大值。
- 执行生成大量切片的查询可能会影响数据库性能。例如,在多个复杂视图上包含
UNION
或UNION ALL
运算符的查询会生成大量切片。你可以在查询上运行EXPLAIN ANALYZE
以查看查询的切片统计信息。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 0 | 0 ~ INT_MAX | master;session;reload |
plan_cache_mode
准备语句(显式准备或隐式生成的,例如 PL / pgSQL)可以使用自定义或通用计划执行。
- 使用其特定的参数值集为每个执行重新生成自定义计划,而通用计划不依赖于参数值,并且可以在执行中重复使用。因此,使用通用计划可以节省计划时间,但如果理想计划严重依赖参数值,则通用计划可能效率低下。
- 这个设置是在执行缓存计划时考虑,而不是在准备计划时考虑。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
enum | auto | auto / force_custom_plan / force_generic_plan | master;session;reload |
JIT(Just in Time) 配置参数
jit
YMatrix 是否允许使用 JIT 编译。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
jit_above_cost
设置激活 JIT(Just-in-Time)编译的查询代价,如果查询代价超过这个值就会激活 JIT 编译。
- 执行 JIT 会消耗一些规划时间,但是能够加速查询执行。
- 将这个值设置为
-1
会禁用 JIT 编译。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
floating point | 100000 | -1 ~ DBL_MAX | master;session;reload |
jit_debugging_support
如果 LLVM 具有所需的功能,请向 GDB 注册生成的函数。这使得调试更容易。
- 此参数只能在服务器启动时或客户端连接启动时设置。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | off | master;session;reload;superuser |
jit_dump_bitcode
将生成的 LLVM IR 写入文件系统,在 data_directory
中。
- 这仅对处理 JIT 实现的内部有用。
- 只有超级用户和具有相应
SET
权限的用户才能更改此设置。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | off | master;session;reload;superuser |
jit_expressions
当激活 JIT 编译时,允许对表达式进行 JIT 编译。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
jit_inline_above_cost
设置 JIT 编译尝试内联函数和操作符的查询代价阈值。
- 如果查询代价超过这个值,JIT 编译就会尝试内联。内联会增加规划时间,但是可以提高执行速度。
- 将这个参数设置成小于
jit_above_cost
是没有意义的。 - 将这个参数设置为
-1
会禁用内联。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
floating point | 500000 | -1 ~ DBL_MAX | master;session;reload |
jit_optimize_above_cost
设置 JIT 编译应用优化的查询代价阈值。
- 如果查询代价超过这个值,JIT 编译就会应用开销较大的优化。这类优化会增加规划时间,但是更能够改进执行速度。
- 将这个参数设置成小于
jit_above_cost
是没有意义的,并且将它设置成大于jit_inline_above_cost
也未必有益。 - 将这个参数设置为
-1
会禁用开销较大的优化。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
floating point | 500000 | -1 ~ DBL_MAX | master;session;reload |
jit_profiling_support
如果 LLVM 具有所需的功能,则发出允许 perf
命令分析 JIT 生成的函数所需的数据。
- 这会将文件写出到
~/.debug/jit/
。如果你设置并加载了环境变量JITDUMPDIR
,它将改为写入JITDUMPDIR/debug/jit
。 - 你有责任在需要时执行清理。
- 此参数只能在服务器启动时或客户端连接启动时设置。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | off | master;session;reload;superuser |
jit_tuple_deforming
当激活 JIT 编译时,允许 JIT 对于元组变形的编译。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
Greenplum ORCA 优化器配置参数
gp_enable_relsize_collection
如果表没有统计信息,则允许 ORCA 优化器和 Postgres 查询优化器使用表的估计大小(pg_relation_size
函数)。
- 默认情况下,如果统计信息不可用,ORCA 和计划程序将使用默认值来估计行数。
- 默认行为可以改善查询优化时间并减少繁重工作负载中的资源队列使用,但可能导致计划不理想。
- 对于分区表的根分区,将忽略此参数。
- 启用 ORCA 且根分区没有统计信息时,ORCA 始终使用默认值。您可以使用
ANALZYE ROOTPARTITION
收集根分区的统计信息。详见 ANALYZE。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | off | master;session;reload |
optimizer
运行 SQL 查询时启用或禁用 GPORCA。
- 默认
on
。如果禁用 GPORCA,YMatrix 数据库将仅使用 Postgres 查询优化器。 - GPORCA 与 Postgres 查询优化器共存。启用 GPORCA 后,YMatrix 数据库会尽可能使用 GPORCA 为查询生成执行计划。如果无法使用 GPORCA,则使用 Postgres 查询优化器。
- 可以为数据库系统,单个数据库或会话或查询设置
optimizer
参数。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
optimizer_analyze_root_partition
对于分区表,控制在表上运行 ANALYZE
命令时是否需要 ROOTPARTITION
关键字来收集根分区统计信息。
- Greenplum 的 GPORCA 优化器在生成查询计划时使用根分区统计信息。Postgres 查询优化器不使用这些统计信息。
- 参数的默认设置为
on
,即ANALYZE
命令可以在不使用ROOTPARTITION
关键字的情况下收集根分区统计信息。在根分区上运行ANALYZE
时,或者在分区表的子叶子分区上运行ANALYZE
并且其他子叶子分区具有统计信息时,将收集根分区统计信息。 - 当该值为
off
时,你必须运行ANALZYE ROOTPARTITION
以收集根分区统计信息。 - 当服务器配置参数
optimizer
的值为on
(默认值)时,此参数的值也应该为on
。 - 有关收集分区表的表统计信息的信息,请见 ANALYZE。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;system;restart |
optimizer_array_expansion_threshold
启用 GPORCA(默认值)并处理包含具有常量数组的谓词的查询时,optimizer_array_expansion_threshold
参数会根据数组中的常量数限制优化过程。
- 如果查询谓词中的数组包含多于参数指定的数字元素,则 GPORCA 会在查询优化期间禁用谓词转换为其析取范式。
例如,当 GPORCA 执行包含具有 100 个以上元素的
IN
子句的查询时,GPORCA 在查询优化期间不会将谓词转换为其析取范式,以减少优化时间消耗更少的内存。查询处理的差异可以在查询EXPLAIN
计划的IN
子句的过滤条件中看到。 - 更改此参数的值会更改较短的优化时间和较低的内存消耗之间的权衡,以及查询优化期间约束派生的潜在好处,例如冲突检测和分区消除。
- 可以为数据库系统,单个数据库或会话或查询设置该参数。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 100 | 0 ~ INT_MAX | master;session;reload |
optimizer_control
控制是否可以使用 SET
,RESET
命令或 YMatrix 数据库实用程序 gpconfig
更改服务器配置参数optimizer
。
- 如果启用了
optimizer_control
参数值,则用户可以设置优化程序参数。 - 如果
optimizer_control
参数值为off
,则无法更改优化程序参数。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;system;restart;superuser |
optimizer_cost_model
启用 GPORCA(默认值)时,此参数控制 GPORCA 选择用于位图扫描的成本模型,该位图扫描与位图索引或 AO 表上的 btree 索引一起使用。
legacy
- 保留 GPORCA 在 Greenplum 数据库版本 6.13 和更早版本中使用的calibrated
代价模型calibrated
- 改进索引的代价估算experimental
- 为未来的实验代价模型保留;目前相当于calibrated
模型- 默认代价模型
calibrated
更有可能选择具有嵌套循环连接(Nested Loop Joins)而不是散列连接(Hash Joins)的更快位图索引。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
enum | calibrated | legacy / calibrated / experimental | master;session;reload |
optimizer_cte_inlining_bound
启用 GPORCA(默认值)时,此参数控制为公用表表达式(CTE)查询(包含 WHERE
子句的查询)执行的内联量。
- 默认值
0
禁用内联。 - 可以为数据库系统,单个数据库或会话或查询设置该参数。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 0 | 0 ~ INT_MAX | master;session;reload |
optimizer_dpe_stats
当启用 Greenplum 的 ORCA 优化器(默认)且此参数为 on
(默认)时,GPORCA 会派生统计数据,使其能够更准确地估计在动态分区消除期间要扫描的行数。
- 可以为数据库系统、单个数据库或者会话或查询设置参数。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
optimizer_enable_associativity
启用 GPORCA(默认设置)时,此参数控制是否在查询优化期间启用连接关联变换。
- 转换分析连接顺序。对于默认值
off
,仅启用用于分析连接顺序的 GPORCA 动态编程算法。 - 连接关联变换很大程度上复制了较新的动态编程算法的功能。
- 如果值为
on
,GPORCA 可以在查询优化期间使用关联变换。 - 可以为数据库系统,单个数据库或会话或查询设置该参数。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | off | master;session;reload |
optimizer_enable_dml
当启用 GPORCA(默认)且此参数为 on
(默认)时,GPORCA 会尝试运行 DML 命令,例如 INSERT
、UPDATE
和 DELETE
。
- 如果 GPORCA 无法运行该命令,YMatrix 数据库将回退到 Postgres 优化器。
- 当设置为 off 时,Greenplum 数据库在执行 DML 命令时总是回退到 Postgres 优化器。
- 可以为数据库系统、单个数据库或者会话或查询设置参数。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
optimizer_enable_indexonlyscan
当启用 GPORCA(默认)并且此参数为 on(默认)时,GPORCA 可以为 B-tree 索引生成 index-only 扫描计划类型。
- GPORCA 只访问索引值,不访问关系的数据块。
- 这提供了查询执行性能的改进,特别是当表已被清空、具有宽列并且 GPORCA 不需要获取任何数据块(例如,它们是可见的)时。
- 当停用(
off
)时,GPORCA 不会生成仅索引扫描计划类型。 - 可以为数据库系统、单个数据库或者会话或查询设置参数。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
optimizer_enable_multiple_distinct_aggs
当启用 GPORCA 时(默认),此参数允许 GPORCA 支持多个不同的合格聚合,例如 SELECT count(DISTINCT a),sum(DISTINCT b) FROM foo
。
- 默认情况下此参数是停用的,因为与 Postgres 优化器生成的计划相比,它的计划通常不是最优的。
- 可以为数据库系统、单个数据库或者会话或查询设置参数。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | off | master;session;reload |
optimizer_force_agg_skew_avoidance
启用 GPORCA(默认值)时,此参数会影响 GPORCA 在生成 3 阶段聚合计划时考虑的查询计划备选方案。
- 当值为
on
时,默认情况下,GPORCA 仅考虑 3 阶段聚合计划, 其中中间聚合使用GROUP BY
和DISTINCT
列进行分发,以减少处理偏斜的影响。 - 如果值为
off
,GPORCA 还可以考虑使用GROUP BY
列进行分发的计划。 - 当处理偏斜存在时,这些计划可能表现不佳。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
optimizer_force_multistage_agg
对于默认设置,启用 GPORCA 且此参数为 on,GPORCA 在生成此类计划备选项时为标量不同的合格聚合选择 3 阶段聚合计划。
- 当值为 off 时,GPORCA 会根据成本选择而不是启发式选择。
- 可以为数据库系统,单个数据库或会话或查询设置该参数。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | off | master;session;reload |
optimizer_force_three_stage_scalar_dqa
对于默认设置,GPORCA 已启用且此参数为 on,GPORCA 会在生成此类计划备选项时选择具有多级聚合的计划。
- 当值为 off 时,GPORCA 会根据成本选择而不是启发式选择。
- 可以为数据库系统,单个数据库或会话或查询设置该参数。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
optimizer_join_arity_for_associativity_commutativity
该值是一个优化提示,用于限制在查询优化期间探索的连接关联性和连接可交换性转换的数量。
- 该限制控制 GPORCA 在查询优化期间考虑的备选计划。例如,默认值
18
是 GPORCA 在优化期间 n-ary 连接运算符具有超过 18 个子节点时停止探索连接关联性和连接交换变换的优化提示。 - 对于具有大量连接的查询,指定较低的值可通过限制 GPORCA 评估的备用查询计划的数量来提高查询性能。
- 但是,将值设置得太低可能会导致 GPORCA 生成次优执行的查询计划。
- 当
optimizer_join_order
参数设置为query
或greedy
时,此参数无效。 - 可以为数据库系统或会话设置此参数。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 18 | 0 ~ INT_MAX | segments;system;reload |
optimizer_join_order
启用 GPORCA 时,此参数通过指定要评估的连接排序备选类型来设置查询优化期间的连接排序的优化级别。
query
- 使用查询中指定的连接顺序。greedy
- 根据连接中关系的最小基数,计算查询中指定的连接顺序和备选方案。exhaustive
- 应用转换规则以查找和评估所有连接排序备选方案。- 默认值是
exhaustive
。将此参数设置为query
或greedy
可以生成次优查询计划。但是,如果管理员确信使用query
或greedy
设置生成了令人满意的计划,则可以通过将参数设置为较低的优化级别来提高查询优化时间。 - 将此参数设置为
query
或greedy
会覆盖optimizer_join_order_threshold
和optimizer_join_arity_for_associativity_commutativity
参数。 - 可以为单个数据库,会话或查询设置此参数。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
enum | exhaustive | exhaustive / greedy / query | master;session;reload |
optimizer_join_order_threshold
启用 GPORCA(默认设置)时,此参数设置 GPORCA 将使用基于动态编程的连接排序算法的最大连接子数。
- 您可以为单个查询或整个会话设置此值。
- 当
optimizer_join_query
参数设置为query
或greedy
时,此参数无效。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 10 | 0 ~ 12 | master;session;reload |
optimizer_mdcache_size
设置 YMatrix 数据库 Master 上 GPORCA 在查询优化期间用于缓存查询元数据(优化数据)的最大内存量(KB)。
- 基于内存限制会话。
- GPORCA 使用默认设置在查询优化期间缓存查询元数据:启用 GPORCA 并启用
optimizer_metadata_caching
。 - 默认值为
16384(16MB)
。这是通过性能分析确定的最佳值。 - 您可以指定
KB
,MB
或GB
的值。默认单位是KB
。例如,值16384
是16384KB
。值1GB
与1024MB
或1048576KB
相同。 - 如果值为
0
,则不限制高速缓存的大小。 - 可以为数据库系统,单个数据库或会话或查询设置此参数。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 16384 | 0 ~ INT_MAX | master;session;reload |
optimizer_metadata_caching
启用 GPORCA(默认值)时,此参数指定 GPORCA 在查询优化期间是否在 YMatrix 数据库 Master 上的内存中缓存查询元数据(优化数据)。
- 缓存是基于会话的。会话结束时,缓存将被释放。如果查询元数据的数量超过缓存大小,则从缓存中逐出旧的未使用的元数据。
- 如果该值为
off
,则 GPORCA 在查询优化期间不会缓存元数据。 - 可以为数据库系统,单个数据库或会话或查询设置此参数。
- 服务器配置参数
optimizer_mdcache_size
控制查询元数据缓存的大小。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
optimizer_parallel_union
启用 GPORCA(默认值)时,optimizer_parallel_union
控制包含 UNION
或 UNION ALL
子句的查询的并行化数量。
- 当值为
off
时,默认 GPORCA 会生成一个查询计划,其中APPEND(UNION)
运算符的每个子项与APPEND
运算符位于同一个切片中。 - 在查询执行期间,子节点以顺序方式执行。
- 当该值打开时,GPORCA 会生成一个查询计划,其中重新分配 Motion 节点位于
APPEND(UNION)
运算符下。 在查询执行期间,子项和父APPEND
运算符位于不同的切片上,允许APPEND(UNION)
运算符的子项在 Segment 实例上并行执行。 - 可以为数据库系统,单个数据库或会话或查询设置该参数。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | off | master;session;reload |
optimizer_penalize_broadcast_threshold
当启用 GPORCA(默认)时,在查询优化期间,GPORCA 会惩罚尝试广播超过此参数指定值的计划的代价。
- 例如,如果此参数设置为
100K
行(默认值),则任何超过 100K 行的广播都会受到严重惩罚。 - 当此参数设置为
0
时,GPORCA 将此广播阈值设置为无限制并且从不惩罚广播动作。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 100000 | 0 ~ INT_MAX | master;session;reload |
optimizer_penalize_skew
启用 GPORCA 时(默认),此参数允许 GPORCA 惩罚 HashJoin 的 Segment 成本,将倾斜的 Redistribute Motion 作为子节点,以在查询优化期间支持 Broadcast Motion。
- 当 NDV(不同值的数量)小于段数时,GPORCA 确定重新分布运动存在倾斜。
- 可以为数据库系统、单个数据库或者会话或查询设置参数。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
optimizer_print_optimization_stats
启用 GPORCA(默认设置)时,此参数可以为查询的各种优化阶段记录 GPORCA 查询优化统计信息。
- 默认值为
off
,请勿记录优化统计信息。 - 要记录优化统计信息,必须将此参数设置为
on
, 并且必须将参数client_min_messages
设置为log
。set optimizer_print_optimization_stats = on;
set client_min_messages = 'log';
- 在查询执行期间或使用
EXPLAIN
或EXPLAIN ANALYZE
命令记录信息。 - 可以为数据库系统,单个数据库或会话或查询设置此参数。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | off | master;session;reload |
optimizer_sort_factor
启用 GPORCA(默认值)时,optimizer_sort_factor
控制在查询优化期间应用于排序操作的成本因子。
- 默认值
1
指定默认排序成本因子。 - 该值是默认因子的增加或减少的比率。例如,值
2.0
将成本因子设置为默认值的两倍,值0.5
将因子设置为默认值的一半。 - 可以为数据库系统,单个数据库或会话或查询设置该参数。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
floating point | 1.0 | 0.0 ~ DBL_MAX | master;session;reload |
Runtime Filter 优化技术配置参数
mx_enable_runtime_filter
是否启用 Runtime Filter。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | master;session;reload |
mx_runtime_join_ratio
当连接外表行数与内表行数的比值小于该值的时候,不触发 Runtime Filter。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 10 | 0 ~ (INT_MAX/2) | master;session;reload |
mx_runtime_max_filter_per_query
每个查询中使用 Runtime Filter 的次数上限。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 4 | 0 ~ (INT_MAX/2) | master;session;reload |
mx_runtime_max_inner_rows
当连接内表的行数大于该值,不触发 Runtime Filter。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 2000000 | 0 ~ (INT_MAX/2) | master;session;reload |
mx_runtime_max_intent_level
当连接外表的行数小于该值,不触发 Runtime Filter。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 3 | 0 ~ (INT_MAX/2) | master;session;reload |
mx_runtime_min_outer_rows
当连接外表的行数小于该值,不触发 Runtime Filter。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 500000 | 0 ~ (INT_MAX/2) | master;session;reload |
mx_runtime_scan_ratio
当连接内表扫描行数与满足连接条件的行数的比值小于该值时,不触发 Runtime Filter。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 25 | 0 ~ (INT_MAX/2) | master;session;reload |
向量化执行引擎配置参数
matrix.enable_mxvector
是否开启向量化执行引擎。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | true | master;session;reload |
matrix.enable_mxv_aggregate
是否启用向量化执行引擎使用组聚集计划。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | true | master;session;reload |
matrix.enable_mxv_hash_aggregate
是否启用向量化执行引擎使用哈希聚集计划。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | true | master;session;reload |
matrix.enable_mxv_append
是否启用向量化执行引擎使用追加计划类型。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | true | master;session;reload |
matrix.enable_mxv_motion
是否启用向量化执行引擎使用 Motion 计划类型。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | true | master;session;reload |
matrix.enable_mxv_presort_aggregate
是否启用向量化执行引擎使用带有显式预排序的聚集计划类型。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | true | master;session;reload |
matrix.enable_mxv_root
是否启用向量化执行引擎的根执行器。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | true | master;session;reload |
matrix.enable_mxv_sort
是否启用向量化执行引擎使用排序计划类型。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | true | master;session;reload |
matrix.enable_mxv_strict_mode
是否启用向量化执行引擎使用严格模式。
- 如果遇到向量化不能处理的表达式,则直接抛出异常,服务器端不再处理当前查询。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | false | master;session;reload |
matrix.enable_mxv_fallback_expression
是否启用向量化执行引擎使用回退表达式。
- 如果关闭此参数,则遇到向量化执行器无法处理的表达式,整个查询都会回到标量的计划(无向量化节点)。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | true | master;session;reload |
matrix.enable_mxv_limit
是否启用向量化执行引擎使用限制计划类型。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | true | master;session;reload |
matrix.enable_mxv_window
是否启用向量化执行引擎使用窗口聚集计划类型。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | false | master;session;reload |
matrix.enable_mxv_subqueryscan
是否启用向量化执行引擎使用子查询扫描计划类型。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | true | master;session;reload |
matrix.enable_mxv_hash_join
是否启用向量化执行引擎使用哈希连接计划类型。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | true | master;session;reload |
matrix.enable_mxv_hash_join_advanced_hashmap
是否为向量化哈希连接启用高级哈希图。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | true | master;session;reload |
matrix.enable_mxv_aggscan
是否启用向量化执行引擎使用聚集扫描计划类型。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | true | master;session;reload |
matrix.enable_mxv_indexscan
是否启用向量化执行引擎使用索引扫描。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | true | master;session;reload |