pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
这些配置参数提供了一种较为粗糙的方法,用于影响查询优化器所选择的查询计划。 如果优化器为某个特定查询选择的默认计划并不理想,一种临时解决方案是 使用这些配置参数强制优化器选择另一种计划。不过,永久关闭其中 某项设置很少是个好主意。改善优化器所选计划质量的更好办法包括 调整规划器代价常数 (见规划器代价常量)、手工运行 ANALYZE、增加 default_statistics_target 配置参数的值,以及使用 ALTER TABLE SET STATISTICS 增加为特定列收集的统计信息量。
enable_bitmapscan (boolean) #启用或禁用查询规划器对位图扫描计划类型的使用。默认值为 on。
enable_hashagg (boolean) #启用或禁用查询规划器对哈希聚合计划类型的使用。默认值为 on。
enable_hashjoin (boolean) #启用或禁用查询规划器对哈希连接计划类型的使用。默认值为 on。
enable_indexscan (boolean) #启用或禁用查询规划器对索引扫描计划类型的使用。默认值为 on。
enable_mergejoin (boolean) #启用或禁用查询规划器对归并连接计划类型的使用。默认值为 on。
enable_nestloop (boolean) #允许或禁止查询规划器使用嵌套循环连接计划。它不可能完全禁止嵌套循环连接,但是关闭这个变量将使得规划器尽可能优先使用其他方法。默认值是on。
enable_seqscan (boolean) #允许或禁止查询规划器使用顺序扫描计划类型。它不可能完全禁止顺序扫描,但是关闭这个变量将使得规划器尽可能优先使用其他方法。默认值是on。
enable_sort (boolean) #允许或禁止查询规划器使用显式排序步骤。它不可能完全禁止显式排序,但是关闭这个变量将使得规划器尽可能优先使用其他方法。默认值是on。
enable_tidscan (boolean) #允许或禁止查询规划器使用TID扫描计划类型。默认值是on。
遗憾的是,没有明确的方法可以确定下文出现的这组“代价”变量的理想值。建议你进行试验并分享你的发现。
effective_cache_size (floating point) #设置规划器对单次索引扫描可用的有效磁盘缓存大小的假设。这个值会被纳入使用索引的代价估计;较高的值使索引扫描更可能被使用,较低的值使顺序扫描更可能被使用。设置这个参数时,应同时考虑PostgreSQL的共享缓冲区,以及内核磁盘缓存中将用于PostgreSQL数据文件的部分。还应考虑预计使用不同索引的并发查询数,因为它们必须共享可用空间。这个参数不影响PostgreSQL分配的共享内存大小,也不会预留内核磁盘缓存;它仅用于估计。该值以磁盘页为单位,通常每页为 8192 字节。默认值是 1000。
random_page_cost (floating point) #设置规划器对非顺序获取磁盘页代价的估计。它以顺序获取一页代价的倍数来衡量。较高的值使规划器更倾向于使用顺序扫描,较低的值使规划器更倾向于使用索引扫描。默认值是 4。
cpu_tuple_cost (floating point) #设置规划器对一次查询中处理每一行的代价估计。默认值是 0.01。
cpu_index_tuple_cost (floating point) #设置规划器对一次索引扫描中处理每一个索引项的代价估计。默认值是 0.005。
cpu_operator_cost (floating point) #设置规划器对WHERE子句中处理每个运算符所需代价的估计。它以顺序获取一页代价的分数来衡量。默认值是 0.0025。
geqo (boolean) #允许或禁止遗传查询优化,它是一种试图不做穷举搜索来进行查询规划的算法。默认是启用。geqo_threshold变量提供了一种更细粒度的方式,可以对某些类别的查询禁用 GEQO。
geqo_threshold (integer) #只有当涉及的FROM项数量至少有这么多个的时候,才使用遗传查询优化(注意一个JOIN只被计为一个FROM项)。默认值是 12。对于更简单的查询,通常会使用普通的穷举搜索规划器,但是对于有很多表的查询穷举搜索会花很长时间,通常比执行一个次优的计划带来的惩罚值还要长。因此,在查询尺寸上的一个阈值是管理 GEQO 使用的一种方便的方法。
geqo_effort (integer) #控制 GEQO 中规划时间和查询计划质量之间的权衡。此变量必须是 1 到 10 之间的整数。默认值是 5。较大的值会增加查询规划所用的时间,但也会提高选择高效查询计划的可能性。
geqo_effort实际并不直接做任何事情;它只是被用来计算其他影响 GEQO 行为的变量(如下所述)的默认值。如果你愿意,你可以手工设置其他参数。
geqo_pool_size (integer) #控制 GEQO 使用的池尺寸,它就是遗传种群中的个体数目。它必须至少为 2,且有用的值通常在 100 到 1000 之间。如果它被设置为零(默认设置)则会基于geqo_effort和查询中表的数量选择一个合适的值。
geqo_generations (integer) #控制 GEQO 使用的代数,即算法的迭代次数。它必须至少为 1,通常有用的值与池大小处于相同范围。如果设置为零(默认设置),则根据geqo_pool_size选择合适的值。
geqo_selection_bias (floating point) #控制 GEQO 使用的选择偏好。选择偏好是种群中的选择压力。值可以是 1.5 到 2.0 之间,后者是默认值。
default_statistics_target (integer) #为没有通过ALTER TABLE SET STATISTICS设置列相关目标的表列设置默认统计目标。更大的值增加了需要做ANALYZE的时间,但是可能会改善规划器的估计质量。默认值是 10。有关PostgreSQL查询规划器使用的统计信息的更多内容, 请参考第 13.2 节。
constraint_exclusion (boolean) #允许或禁止查询规划器使用表约束来优化查询。默认值是off。
当这个参数为on时,规划器会比较查询条件与表的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,从而提高性能。
目前,constraint_exclusion默认是禁用的,因为约束检查的代价相对较高, 而且在许多情况下不会带来任何节省。建议只在确实使用为利用该特性而设计的分区表时才启用它。
关于在PostgreSQL中使用约束排除和分区的更多信息请参阅第 5.9 节。
from_collapse_limit (integer) #如果生成的FROM列表不超过这么多项,规划器将把子查询融合到上层查询。较小的值可以减少规划时间,但是可能会生成较差的查询计划。默认值是 8。通常应让它小于 GEQO geqo_threshold。
join_collapse_limit (integer) #只要最终得到的列表总项数不超过这个数目,规划器就会把显式内JOIN结构改写为FROM项的列表。在PostgreSQL 7.4 之前,通过JOIN结构指定的连接永远不会被查询规划器重新排序。查询规划器后来得到了改进,使得以这种形式书写的内连接可以被重新排序;这个配置参数控制这种重排进行的程度。
目前,通过JOIN结构指定的外连接的顺序永远不会被查询规划器调整;因此,join_collapse_limit对这一行为没有影响。规划器可能会在PostgreSQL的未来版本中改进为能对某些类别的外连接重新排序。
默认情况下,这个变量被设置为与from_collapse_limit相同的值,这适合大多数用途。把它设置为 1 可以禁止内JOIN的任何重新排序。因此,查询中指定的显式连接顺序就是关系实际连接的顺序。查询规划器并不总是选择最优的连接顺序;高级用户可以选择临时把这个变量设置为 1,然后显式指定他们想要的连接顺序。把这个变量设置为 1 的另一个后果是,查询规划器的行为会更像PostgreSQL 7.3 的查询规划器,一些用户可能出于向后兼容的考虑觉得这很有用。
把这个变量设置为 1 到from_collapse_limit之间的值,可能有助于在规划时间和所选计划的质量之间做权衡(较高的值产生较好的计划)。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。