这些配置参数提供了一种粗略的方法来影响查询优化器选择的查询计划。如果优化器为特定查询选择的默认计划不是最优的,一个临时的解决方案是使用这些配置参数之一来强制优化器选择不同的计划。提高优化器选择的计划质量的更好方法包括调整规划器成本常量(见第 19.7.2 节),手动运行ANALYZE
,增加default_statistics_target配置参数的值,以及使用ALTER TABLE SET STATISTICS
增加为特定列收集的统计信息量。
enable_async_append
( boolean
) #启用或禁用查询规划器对异步感知附加计划类型的使用。默认值为 on
。
enable_bitmapscan
( boolean
) #启用或禁用查询规划器对位图扫描计划类型的使用。默认值为 on
。
enable_gathermerge
( boolean
) #启用或禁用查询规划器对聚集合并计划类型的使用。默认值为 on
。
enable_group_by_reordering
( boolean
) #控制查询规划器是否会生成一个计划,该计划将提供按照计划子节点(例如索引扫描)的键顺序排序的GROUP BY
键。禁用时,查询规划器将生成一个计划,其中的GROUP BY
键仅排序以匹配ORDER BY
子句(如果有)。启用时,规划器将尝试生成一个更高效的计划。默认值为 on
。
enable_hashagg
( boolean
) #启用或禁用查询规划器对哈希聚合计划类型的使用。默认值为 on
。
enable_hashjoin
( boolean
) #启用或禁用查询规划器对哈希连接计划类型的使用。默认值为 on
。
enable_incremental_sort
( boolean
) #启用或禁用查询规划器对增量排序步骤的使用。默认值为 on
。
enable_indexscan
( boolean
) #启用或禁用查询规划器对索引扫描和仅索引扫描计划类型的使用。默认值为 on
。另请参阅enable_indexonlyscan。
enable_indexonlyscan
( boolean
) #启用或禁用查询规划器对仅索引扫描计划类型的使用(请参阅第 11.9 节)。默认值为 on
。还必须启用enable_indexscan设置,查询规划器才会考虑仅索引扫描。
enable_material
( boolean
) #启用或禁用查询规划器对物化(materialization)的使用。不可能完全抑制物化,但关闭此变量可以防止规划器插入物化节点,除非在需要确保正确性的情况下。默认值为 on
。
enable_memoize
( boolean
) #启用或禁用查询规划器对备忘计划的使用,以缓存嵌套循环连接中参数化扫描的结果。当当前参数的结果已在缓存中时,此计划类型允许跳过对底层计划的扫描。当需要更多空间用于新条目时,不太常用的结果可能会从缓存中逐出。默认值为 on
。
enable_mergejoin
( boolean
) #启用或禁用查询规划器对归并连接计划类型的使用。默认值为 on
。
enable_nestloop
( boolean
) #启用或禁用查询规划器对嵌套循环连接计划的使用。不可能完全抑制嵌套循环连接,但关闭此变量会阻止规划器在有其他方法可用时使用它。默认值为 on
。
enable_parallel_append
( boolean
) #启用或禁用查询规划器对并行感知附加计划类型的使用。默认值为 on
。
enable_parallel_hash
( boolean
) #启用或禁用查询规划器对带有并行哈希的哈希连接计划类型的使用。如果未同时启用哈希连接计划,则无效。默认值为 on
。
enable_partition_pruning
( boolean
) #启用或禁用查询规划器从查询计划中消除分区表的分区的功能。这还控制规划器生成允许查询执行器在查询执行期间删除(忽略)分区的查询计划的能力。默认值为 on
。有关详细信息,请参阅第 5.12.4 节。
enable_partitionwise_join
( boolean
) #启用或禁用查询规划器使用分区连接,它允许通过连接匹配的分区来执行分区表之间的连接。分区连接当前仅适用于连接条件包含所有分区键的情况,这些分区键必须具有相同的数据类型和一对一匹配的子分区集合。启用此设置后,最终计划中受 work_mem
限制内存使用的节点数量可能会根据扫描的分区数量线性增加。这可能导致查询执行期间整体内存消耗大幅增加。查询规划在内存和 CPU 方面也会变得明显更加昂贵。默认值为 off
。
enable_partitionwise_aggregate
(boolean
) #启用或禁用查询规划器使用分区分组或聚合,这允许对分区表上的分组或聚合操作在每个分区上单独执行。如果 GROUP BY
子句不包含分区键,则只能在每个分区的基础上执行部分聚合,并且必须稍后执行最终化。启用此设置后,最终计划中受 work_mem
限制内存使用的节点数量可能会根据扫描的分区数量线性增加。这可能导致查询执行期间整体内存消耗大幅增加。查询规划在内存和 CPU 方面也会变得明显更加昂贵。默认值为 off
。
enable_presorted_aggregate
(boolean
) #控制查询规划器是否生成一个计划,该计划将提供按照查询的 ORDER BY
/ DISTINCT
聚合函数所需的顺序预先排序的行。禁用后,查询规划器将生成一个计划,该计划始终要求执行器在执行包含 ORDER BY
或 DISTINCT
子句的每个聚合函数的聚合之前执行排序。启用后,规划器将尝试生成一个更高效的计划,该计划为聚合函数提供以它们所需的聚合顺序预先排序的输入。默认值为 on
。
enable_seqscan
(boolean
) #启用或禁用查询规划器使用顺序扫描计划类型。不可能完全抑制顺序扫描,但是如果存在其他可用方法,则关闭此变量会阻止规划器使用顺序扫描。默认值为 on
。
enable_sort
(boolean
) #启用或禁用查询规划器使用显式排序步骤。不可能完全抑制显式排序,但是如果存在其他可用方法,则关闭此变量会阻止规划器使用显式排序。默认值为 on
。
enable_tidscan
(boolean
) #启用或禁用查询规划器使用TID扫描计划类型。默认值为 on
。
本节中描述的 成本 变量以任意尺度衡量。只有它们的相对值才重要,因此将它们全部按相同的因子放大或缩小不会导致规划器选择的更改。默认情况下,这些成本变量基于顺序页面获取的成本;也就是说,seq_page_cost
通常设置为 1.0
,而其他成本变量则参考该值设置。但是,如果愿意,可以使用不同的尺度,例如特定机器上的实际执行时间(以毫秒为单位)。
不幸的是,没有定义明确的方法来确定成本变量的理想值。它们最好被视为特定安装将接收的整个查询混合的平均值。这意味着仅根据少量实验来更改它们是非常危险的。
seq_page_cost
(floating point
) #设置规划器对作为一系列顺序获取的一部分的磁盘页面获取成本的估计。默认值为 1.0。可以通过设置相同名称的表空间参数来覆盖特定表空间中表和索引的此值(请参阅 ALTER TABLESPACE)。
random_page_cost
(floating point
) #设置规划器对非顺序获取的磁盘页面的成本的估计。默认值为 4.0。可以通过设置相同名称的表空间参数来覆盖特定表空间中表和索引的此值(请参阅 ALTER TABLESPACE)。
相对于 seq_page_cost
减小此值将使系统更倾向于索引扫描;提高它会使索引扫描看起来相对更昂贵。您可以一起提高或降低这两个值,以更改磁盘 I/O 成本相对于 CPU 成本的重要性,这些成本由以下参数描述。
对机械磁盘存储的随机访问通常比顺序访问昂贵得多。但是,使用较低的默认值 (4.0),因为假定对磁盘的大多数随机访问(例如索引读取)都位于缓存中。默认值可以被认为是对随机访问建模为比顺序访问慢 40 倍,同时预计 90% 的随机读取将被缓存。
如果您认为 90% 的缓存率对于您的工作负载是不正确的假设,您可以增加 random_page_cost 以更好地反映随机存储读取的真实成本。相应地,如果您的数据可能完全在缓存中,例如当数据库小于服务器总内存时,降低 random_page_cost 可能适合。相对于顺序访问,随机读取成本较低的存储(例如,固态驱动器)也可能更适合使用较低的 random_page_cost 值进行建模,例如 1.1
。
尽管系统允许您将 random_page_cost
设置为小于 seq_page_cost
的值,但这在物理上是不合理的。但是,如果数据库完全缓存在 RAM 中,则将它们设置为相等是有意义的,因为在这种情况下,按顺序访问页面不会受到任何惩罚。此外,在高度缓存的数据库中,您应该相对于 CPU 参数降低这两个值,因为从 RAM 中获取页面的成本远小于正常情况下的成本。
cpu_tuple_cost
(floating point
) #设置规划器对查询期间处理每一行的成本的估计。默认值为 0.01。
cpu_index_tuple_cost
(floating point
) #设置规划器对索引扫描期间处理每个索引条目的成本的估计。默认值为 0.005。
cpu_operator_cost
(floating point
) #设置规划器对查询期间执行的每个运算符或函数的成本的估计。默认值为 0.0025。
parallel_setup_cost
(floating point
) #设置规划器对启动并行工作进程的成本的估计。默认值为 1000。
parallel_tuple_cost
(floating point
) #设置规划器对将一个元组从一个并行工作进程传输到另一个进程的成本的估计。默认值为 0.1。
min_parallel_table_scan_size
(integer
) #设置为了考虑并行扫描而必须扫描的最小表数据量。对于并行顺序扫描,扫描的表数据量始终等于表的大小,但是当使用索引时,扫描的表数据量通常会减少。如果指定此值时没有单位,则将其视为块,即 BLCKSZ
字节,通常为 8kB。默认值为 8 兆字节 (8MB
)。
min_parallel_index_scan_size
(integer
) #设置为了考虑并行扫描而必须扫描的最小索引数据量。请注意,并行索引扫描通常不会触及整个索引;而是规划器认为扫描实际将触及的页面数才是相关的。此参数还用于确定特定索引是否可以参与并行 vacuum。请参阅 VACUUM。如果指定此值时没有单位,则将其视为块,即 BLCKSZ
字节,通常为 8kB。默认值为 512 千字节 (512kB
)。
effective_cache_size
(integer
) #设置规划器对单个查询可用的磁盘缓存有效大小的假设。这会影响使用索引的成本估算;较高的值会使索引扫描更有可能被使用,较低的值会使顺序扫描更有可能被使用。在设置此参数时,应考虑 PostgreSQL 的共享缓冲区和内核磁盘缓存中将用于 PostgreSQL 数据文件的部分,尽管某些数据可能同时存在于这两个位置。此外,还要考虑不同表上预期并发查询的数量,因为它们必须共享可用空间。此参数对 PostgreSQL 分配的共享内存大小没有影响,也不会保留内核磁盘缓存;它仅用于估算目的。系统也不假设数据在查询之间保留在磁盘缓存中。如果此值在指定时没有单位,则将其视为块,即 BLCKSZ
字节,通常为 8kB。默认值为 4 GB (4GB
)。(如果 BLCKSZ
不是 8kB,则默认值会按比例缩放。)
jit_above_cost
(浮点数
) #设置查询成本的阈值,高于此阈值将激活 JIT 编译(如果已启用)(请参阅 第 30 章)。执行JIT会增加规划时间,但可以加快查询执行速度。将其设置为 -1
将禁用 JIT 编译。默认值为 100000
。
jit_inline_above_cost
(浮点数
) #设置查询成本的阈值,高于此阈值 JIT 编译会尝试内联函数和运算符。内联会增加规划时间,但可以提高执行速度。将其设置为小于 jit_above_cost
的值是没有意义的。将其设置为 -1
将禁用内联。默认值为 500000
。
jit_optimize_above_cost
(浮点数
) #设置查询成本的阈值,高于此阈值 JIT 编译会应用昂贵的优化。此类优化会增加规划时间,但可以提高执行速度。将其设置为小于 jit_above_cost
的值是没有意义的,并且将其设置为大于 jit_inline_above_cost
的值也不太可能带来好处。将其设置为 -1
将禁用昂贵的优化。默认值为 500000
。
遗传查询优化器 (GEQO) 是一种使用启发式搜索进行查询规划的算法。它可以减少复杂查询(连接多个关系的查询)的规划时间,但代价是生成的计划有时不如普通穷举搜索算法找到的计划。有关更多信息,请参阅 第 60 章。
geqo
(布尔值
) #启用或禁用遗传查询优化。默认情况下启用。通常最好不要在生产环境中将其关闭;geqo_threshold
变量提供了对 GEQO 更精细的控制。
geqo_threshold
(整数
) #使用遗传查询优化来规划至少包含这么多 FROM
项的查询。(请注意,FULL OUTER JOIN
结构只算作一个 FROM
项。)默认值为 12。对于较简单的查询,通常最好使用常规的穷举搜索规划器,但是对于包含许多表的查询,穷举搜索耗时太长,通常比执行次优计划的惩罚时间还要长。因此,对查询的大小设置阈值是管理 GEQO 使用的一种便捷方式。
geqo_effort
(整数
) #控制 GEQO 中规划时间和查询计划质量之间的权衡。此变量必须是 1 到 10 范围内的整数。默认值为 5。较大的值会增加查询规划所花费的时间,但也增加了选择高效查询计划的可能性。
geqo_effort
实际上不会直接执行任何操作;它仅用于计算影响 GEQO 行为的其他变量(如下所述)的默认值。如果您愿意,也可以手动设置其他参数。
geqo_pool_size
(整数
) #控制 GEQO 使用的池大小,即遗传种群中的个体数量。它必须至少为 2,有用的值通常为 100 到 1000。如果将其设置为零(默认设置),则会根据 geqo_effort
和查询中的表数量选择合适的值。
geqo_generations
(整数
) #控制 GEQO 使用的代数,即算法的迭代次数。它必须至少为 1,有用的值与池大小的范围相同。如果将其设置为零(默认设置),则会根据 geqo_pool_size
选择合适的值。
geqo_selection_bias
(浮点数
) #控制 GEQO 使用的选择偏差。选择偏差是种群内的选择压力。值可以是 1.50 到 2.00;后者是默认值。
geqo_seed
(浮点数
) #控制 GEQO 使用的随机数生成器的初始值,用于选择通过连接顺序搜索空间的随机路径。该值范围可以从零(默认值)到一。更改该值会改变探索的连接路径集,并可能导致找到更好或更差的最佳路径。
default_statistics_target
(整数
) #设置没有通过 ALTER TABLE SET STATISTICS
设置列特定目标的表列的默认统计目标。较大的值会增加执行 ANALYZE
所需的时间,但可能会提高规划器估计的质量。默认值为 100。有关 PostgreSQL 查询规划器使用统计信息的更多信息,请参阅 第 14.2 节。
constraint_exclusion
(枚举
) #控制查询规划器使用表约束来优化查询。 constraint_exclusion
的允许值为 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 控制。)
有关使用约束排除来实现分区的更多信息,请参阅 第 5.12.5 节。
cursor_tuple_fraction
(浮点数
) #设置规划器对将要检索的游标行数的估计值。默认值为 0.1。此设置的较小值会使规划器倾向于使用游标的 “快速启动” 计划,这将快速检索前几行,但可能需要很长时间才能获取所有行。较大的值会更强调总估计时间。在最大设置 1.0 时,游标的规划方式与常规查询完全相同,仅考虑总估计时间,而不考虑前几行可能交付的时间。
from_collapse_limit
(整数
) #如果生成的 FROM
列表中的项不超过此数量,则规划器会将子查询合并到上层查询中。较小的值会减少规划时间,但可能会产生较差的查询计划。默认值为 8。有关更多信息,请参阅 第 14.3 节。
将此值设置为 geqo_threshold 或更大值可能会触发使用 GEQO 规划器,从而导致非最佳计划。请参阅 第 19.7.3 节。
jit
(布尔值
) #确定是否JIT如果可用,PostgreSQL 可以使用编译(请参阅 第 30 章)。默认值为 on
。
join_collapse_limit
(整数
) #当生成的列表中的项不超过此数量时,规划器会将显式 JOIN
结构(FULL JOIN
除外)重写为 FROM
项的列表。较小的值会减少规划时间,但可能会产生较差的查询计划。
默认情况下,此变量的设置与 from_collapse_limit
相同,这适用于大多数用途。将其设置为 1 可防止对显式 JOIN
进行任何重新排序。因此,查询中指定的显式连接顺序将是关系连接的实际顺序。由于查询规划器并不总是选择最佳连接顺序,因此高级用户可以选择暂时将此变量设置为 1,然后显式指定所需的连接顺序。有关更多信息,请参阅第 14.3 节。
将此值设置为 geqo_threshold 或更大值可能会触发使用 GEQO 规划器,从而导致非最佳计划。请参阅 第 19.7.3 节。
plan_cache_mode
( enum
) #预处理语句(显式预处理或隐式生成,例如由 PL/pgSQL 生成)可以使用自定义或通用计划执行。自定义计划是为每次执行使用其特定参数值重新生成的,而通用计划不依赖于参数值,并且可以在多次执行中重复使用。因此,使用通用计划可以节省规划时间,但如果理想的计划强烈依赖于参数值,则通用计划可能效率低下。plan_cache_mode
通常会自动选择这些选项,但可以使用 plan_cache_mode
覆盖。允许的值为 auto
(默认)、force_custom_plan
和 force_generic_plan
。当要执行缓存计划时,而不是在准备计划时,才会考虑此设置。有关更多信息,请参阅 PREPARE。
recursive_worktable_factor
( 浮点数
) #设置规划器对递归查询的工作表的平均大小的估计,作为查询的初始非递归项的估计大小的倍数。这有助于规划器选择将工作表连接到查询的其他表的最合适方法。默认值为 10.0
。当递归从一步到下一步的“扇出”较低时(例如在最短路径查询中),较小的值(如 1.0
)可能会有所帮助。图分析查询可能会受益于大于默认值的值。
如果您在文档中发现任何不正确、与特定功能的体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。