# 20.7.查询计划

20.7.1. 规划器方法配置

20.7.2. 规划师成本常数

20.7.3. 遗传查询优化器

20.7.4. 其他计划者选项

# 20.7.1.规划器方法配置

这些配置参数提供了影响查询优化器选择的查询计划的粗略方法。如果优化器为特定查询选择的默认计划不是最优的,则短暂的解决方案是使用这些配置参数之一强制优化器选择不同的计划。提高优化器选择的计划质量的更好方法包括调整planner成本常数(请参阅第20.7.2节),跑步分析手动,增加违约_统计数字_目标配置参数,并使用改变表集统计.

启用异步附加(布尔值)

启用或禁用查询计划器使用异步感知的追加计划类型。默认值是在…上.

启用位图扫描(布尔值)

启用或禁用查询计划器对位图扫描计划类型的使用。默认值是在…上.

启用合并 (布尔值)

启用或禁用查询计划器对聚集合并计划类型的使用。默认值是在…上.

启用_hashagg (布尔值)

启用或禁用查询计划器对哈希聚合计划类型的使用。默认值是在…上.

启用\u hashjoin (布尔值)

启用或禁用查询计划器对哈希联接计划类型的使用。默认值是在…上.

启用增量排序 (布尔值)

启用或禁用查询计划器对增量排序步骤的使用。默认值是在…上.

启用索引扫描 (布尔值)

启用或禁用查询计划器对索引扫描计划类型的使用。默认值是在…上.

启用_indexonlyscan (布尔值)

启用或禁用查询计划器对仅索引扫描计划类型的使用(请参阅第11.9节).默认值为在…上.

启用_材质 (布尔值)

启用或禁用查询计划器对物化的使用。不可能完全抑制物化,但是关闭此变量会阻止规划器插入物化节点,除非正确性需要它。默认值是在…上.

启用记忆 (布尔值)

启用或禁用查询计划器使用memoize计划缓存嵌套循环联接内参数化扫描的结果。当当前参数的结果已在缓存中时,此计划类型允许跳过对基础计划的扫描。当新条目需要更多空间时,不太常见的查找结果可能会从缓存中逐出。默认值是在…上.

启用合并加入 (布尔值)

启用或禁用查询计划器对合并联接计划类型的使用。默认值是在…上.

启用嵌套循环 (布尔值)

启用或禁用查询计划器对嵌套循环联接计划的使用。完全抑制嵌套循环联接是不可能的,但如果有其他方法可用,关闭此变量会阻止规划人员使用嵌套循环联接。默认值是在…上.

启用\u并行\u追加 (布尔值)

启用或禁用查询计划器对并行感知追加计划类型的使用。默认值是在…上.

启用\u并行\u哈希 (布尔值)

启用或禁用查询计划器对具有并行哈希的哈希联接计划类型的使用。如果未启用哈希联接计划,则无效。默认值是在…上.

启用分区修剪 (布尔值)

启用或禁用查询计划器从查询计划中删除分区表分区的功能。这还控制了规划器生成查询计划的能力,该计划允许查询执行器在查询执行期间删除(忽略)分区。默认值是在…上看见第5.11.4节详细信息。

启用分区连接 (布尔值)

启用或禁用查询计划器对分区联接的使用,分区联接允许通过联接匹配的分区来执行分区表之间的联接。Partitionwise join当前仅适用于连接条件包括所有分区键的情况,这些分区键必须是相同的数据类型,并且具有一对一的子分区匹配集。由于分区连接规划可以在规划期间使用更多的CPU时间和内存,因此默认值为.

启用分区聚合 (布尔值)

启用或禁用查询计划器对分区分组或聚合的使用,这允许对分区表进行分组或聚合,并为每个分区单独执行。如果分组子句不包括分区键,每个分区只能执行部分聚合,并且必须在以后执行终结。由于分区分组或聚合在规划过程中会占用大量CPU时间和内存,因此默认情况下.

启用顺序扫描 (布尔值)

启用或禁用查询计划器对顺序扫描计划类型的使用。不可能完全抑制顺序扫描,但如果有其他方法可用,关闭此变量会阻止规划人员使用顺序扫描。默认值是在…上.

启用排序 (布尔值)

启用或禁用查询计划器对显式排序步骤的使用。不可能完全抑制显式排序,但如果有其他方法可用,关闭此变量会阻止计划人员使用显式排序。默认值是在…上.

启用tidscan (布尔值)

启用或禁用查询计划器对TID扫描计划类型的使用。默认值是在…上.

# 20.7.2.规划师成本常数

这个费用本节中描述的变量以任意比例进行测量。只有它们的相对值才重要,因此按相同的因子将它们放大或缩小,不会导致规划者的选择发生变化。默认情况下,这些成本变量基于连续页面获取的成本;就是,seq_page_成本按惯例设置为1其他的成本变量都是参照这个设定的。但如果愿意,可以使用不同的比例,例如特定机器上以毫秒为单位的实际执行时间。

# 笔记

不幸的是,没有明确定义的方法来确定成本变量的理想值。它们最好被视为特定安装将收到的整个查询组合的平均值。这意味着仅仅在几个实验的基础上改变它们是非常危险的。

seq_page_成本 (浮点数)

设置规划师对磁盘页提取成本的估计,该提取是一系列连续提取的一部分。默认值为1.0.对于特定表空间中的表和索引,可以通过设置相同名称的表空间参数来覆盖该值(请参见改变表空间).

随机页面成本 (浮点数)

设置规划师对非顺序获取的磁盘页的成本估计。默认值为4.0.对于特定表空间中的表和索引,可以通过设置相同名称的表空间参数来覆盖该值(请参见改变表空间).

将此值相对于seq_page_成本将导致系统更喜欢索引扫描;提高它会使索引扫描看起来相对更昂贵。您可以同时提高或降低这两个值,以更改磁盘I/O成本相对于CPU成本的重要性,CPU成本由以下参数描述。

对机械磁盘存储器的随机存取通常比四次顺序存取昂贵得多。但是,使用较低的默认值(4.0),因为对磁盘的大多数随机访问(如索引读取)都假定在缓存中。默认值可以被认为是将随机访问建模为比顺序访问慢40倍,同时期望缓存90%的随机读取。

如果您认为90%的缓存率对于您的工作负载来说是一个错误的假设,那么您可以增加随机缓存率_页_成本,以更好地反映随机存储读取的真实成本。相应地,如果您的数据可能完全在缓存中,例如当数据库小于服务器的总内存时,减少随机访问_页_成本可以是适当的。与顺序存储相比,随机读取成本较低的存储,例如固态驱动器,也可以使用较低的随机读取成本值来更好地建模_页_成本,例如:。,1.1.

# 提示

虽然系统会让你设置随机页面成本少于seq_page_成本,这样做在生理上是不明智的。然而,如果数据库完全缓存在RAM中,那么将它们设置为相等是有意义的,因为在这种情况下,不按顺序触摸页面不会受到惩罚。此外,在高速缓存的数据库中,您应该降低这两个值相对于CPU参数的值,因为获取RAM中已经存在的页面的成本比正常情况下要小得多。

cpu成本 (浮点数)

设置计划者对查询期间处理每行的成本的估计。默认值为0.01.

cpu索引元组成本 (浮点数)

设置计划员对索引扫描期间处理每个索引项的成本的估计。默认值为0.005.

cpu_操作员_成本 (浮点数)

设置规划师对查询期间执行的每个运算符或函数的处理成本的估计。默认值为0.0025.

并行设置成本 (浮点数)

设置规划者对启动并行工作进程的成本的估计。默认值为1000.

并行成本 (浮点数)

设置规划者对将一个元组从并行工作进程转移到另一个进程的成本的估计。默认值为0.1.

最小平行扫描表扫描尺寸 (整数)

设置必须扫描的最小表格数据量,以便考虑并行扫描。对于并行顺序扫描,扫描的表数据量始终等于表的大小,但使用索引时,扫描的表数据量通常会较少。如果指定该值时没有单位,则将其视为块,即BLCKSZ字节,通常为8kB。默认值为8兆字节(8MB).

最小并行索引扫描大小 (整数)

设置为考虑并行扫描而必须扫描的最小索引数据量。请注意,并行索引扫描通常不会触及整个索引;这是规划者认为扫描实际会涉及的页面数。该参数还用于确定特定索引是否可以参与并行真空。看见真空.如果指定的值没有单位,则将其视为块,即BLCKSZ字节,通常为8kB。默认值为512 KB(512kB).

有效缓存大小 (整数)

设置规划师对单个查询可用的磁盘缓存的有效大小的假设。这被纳入使用指数的成本估算中;值越高,使用索引扫描的可能性越大,值越低,使用顺序扫描的可能性越大。在设置此参数时,应考虑PostgreSQL的共享缓冲区和内核的磁盘缓存部分,这将用于PostgreSQL数据文件,但可能在两个地方都存在一些数据。此外,还要考虑不同表上并发查询的预期数量,因为它们必须共享可用空间。该参数不影响PostgreSQL分配的共享内存大小,也不保留内核磁盘缓存;它仅用于估算目的。系统也不假设在查询之间数据仍保留在磁盘缓存中。如果指定该值时没有单位,则将其视为块,即BLCKSZ字节,通常为8kB。默认值为4G字节(4GB)(如果BLCKSZ不是8kB,默认值与之成比例。)

高于成本的准时制 (浮点数)

设置激活JIT编译的查询成本(如果启用)(请参阅第32章).执行JIT需要花费计划时间,但可以加快查询执行。将此设置为-1禁用JIT编译。默认值是100000.

jit_inline_高于成本 (浮点数)

设置JIT编译尝试内联函数和运算符的查询开销。内联增加了计划时间,但可以提高执行速度。将其设置为小于高于成本的准时制.将此设置为-1禁用内联。默认值是500000.

jit_优化_高于成本 (浮点数)

设置JIT编译应用昂贵优化的查询成本。这样的优化增加了计划时间,但可以提高执行速度。将其设置为小于高于成本的准时制,并且将其设置为大于jit_inline_above_cost.将此设置为-1禁用昂贵的优化。默认是500000.

# 20.7.3.

遗传查询优化器遗传查询优化器 (GEQO) 是一种使用启发式搜索进行查询规划的算法。这减少了复杂查询(加入许多关系的查询)的计划时间,代价是生成的计划有时不如正常的穷举搜索算法找到的计划。有关更多信息,请参阅第 60 章

.棋子(布尔值

)启用或禁用遗传查询优化。这是默认开启的。通常最好不要在生产中关闭它;geqo_threshold

变量提供对 GEQO 的更精细控制。geqo_threshold(整数

)使用遗传查询优化来计划至少有这么多的查询从涉及的项目。(请注意,一个全外连接构造仅计为一个从item.) 默认值为 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 用于通过连接顺序搜索空间选择随机路径的随机数生成器的初始值。该值的范围可以从零(默认值)到一。

改变值会改变探索的连接路径集,并可能导致找到更好或更差的最佳路径。

# 20.7.4.

其他规划器选项default_statistics_target(整数

)为没有设置特定列目标的表列设置默认统计目标更改表集统计信息.较大的值会增加执行所需的时间分析,但可能会提高规划者估计的质量。默认值为 100.有关 PostgreSQL 查询计划器使用统计信息的更多信息,请参阅第 14.2 节.

约束排除(枚举)

控制查询计划器使用表约束来优化查询。的允许值约束排除(检查所有表的约束),离开(从不检查约束),和分割(仅检查继承子表的约束和联合所有子查询)。分割是默认设置。它通常与传统的继承树一起使用以提高性能。

当此参数允许它用于特定表时,计划器将查询条件与表的条件进行比较查看约束,并忽略条件与约束相矛盾的扫描表。例如:

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;

启用约束排除后,这选择不会扫描儿童1000总之,提高性能。

目前,默认情况下,仅对经常用于通过继承树实现表分区的情况启用约束排除。为所有表打开它会带来额外的计划开销,这在简单查询中非常明显,并且通常不会对简单查询产生任何好处。如果您没有使用传统继承进行分区的表,您可能更愿意完全关闭它。(请注意,分区表的等效功能由单独的参数控制,使能够_划分_修剪.)

参考第 5.11.5 节有关使用约束排除来实现分区的更多信息。

cursor_tuple_fraction(浮点)

设置计划者对将被检索的游标行的分数的估计。默认值为 0.1.此设置的较小值会使规划器倾向于使用游标的“快速启动”规划,这将快速检索前几行,而可能需要很长时间才能获取所有行。较大的值更加强调总估计时间。在最大设置为 1.0 时,游标的计划与常规查询完全一样,只考虑总估计时间,而不考虑第一行的交付时间。

from_collapse_limit(整数)

计划器会将子查询合并到上层查询中,如果结果列表不会超过这么多项目。较小的值会减少计划时间,但可能会产生较差的查询计划。默认值为八。有关更多信息,请参阅第 14.3 节.

将此值设置为棋子_临界点或更多可能会触发 GEQO 计划器的使用,从而导致非最佳计划。看第 20.7.3 节.

吉特(布尔值)

确定 PostgreSQL 是否可以使用 JIT 编译(如果可用)(请参阅第32章)。默认是.

join_collapse_limit(整数)

计划者将重写显式加入构造(除了完全加入s) 进入列表每当出现不超过这么多项目的列表时。较小的值会减少计划时间,但可能会产生较差的查询计划。

默认情况下,此变量设置为from_collapse_limit,这适用于大多数用途。将其设置为 1 可防止显式重新排序加入s。因此,查询中指定的显式连接顺序将是连接关系的实际顺序。因为查询计划器并不总是选择最佳连接顺序,高级用户可以选择暂时将此变量设置为 1,然后明确指定他们想要的连接顺序。有关更多信息,请参阅第 14.3 节.

将此值设置为棋子_临界点或更多可能会触发 GEQO 计划器的使用,从而导致非最佳计划。看第 20.7.3 节.

plan_cache_mode(枚举)

准备好的语句(显式准备或隐式生成,例如通过 PL/pgSQL)可以使用自定义或通用计划执行。使用其特定的参数值集为每次执行重新制定自定义计划,而通用计划不依赖于参数值并且可以跨执行重复使用。因此,使用通用计划可以节省计划时间,但如果理想计划强烈依赖于参数值,那么通用计划可能效率低下。这些选项之间的选择通常是自动进行的,但可以用plan_cache_mode.允许的值为汽车(默认),force_custom_planforce_generic_plan.当一个缓存的计划被执行时考虑这个设置,而不是在它准备好的时候。有关更多信息,请参阅准备.