Whoami:5年+金融、政府、医疗领域工作经验的DBACertificate:PGCM、OCP、YCPSkill:Oracle、Mysql、PostgreSQL、国产数据库Platform:CSDN、墨天轮、公众号(呆呆的私房菜)
PostgreSQL的成本参数是用于帮助数据库优化器估算不同查询计划的成本,以便选择最佳的执行计划。
seq_page_cost: 全表扫描时,读取单个数据块的扫描成本,默认值1.0;random_page_cost: 索引扫描时,单个数据块的扫描成本,默认值4.0;cpu_tuple_cost: 处理每个元组消耗的CPU成本,默认值0.01;cpu_index_tuple_cost: 处理每个索引元组消耗的CPU成本,默认值是0.005;cpu_operator_cost: 操作每个操作符或函数时消耗的CPU成本,默认值是0.0025。
这些值都是相对的成本值,一般以 seq_page_cost 为基准。比如 random_page_cost 为4.0,表示执行计划中计算随机访问的一个数据块页面的开销为顺序访问一个数据库开销的4倍。
一般来说,如果服务器更换了磁盘I/O能力更强的硬件,可以尝试调低 seq_page_cost 和 random_page_cost 的值。同理可得,CPU处理能力越强,cpu_tuple_cost 和 cpu_index_tuple_cost 以及 cpu_operator_cost 参数也可适当调低。
PostgreSQL的内存参数对数据库性能至关重要。
shared_buffers:用于缓存表和索引数据的内存大小,默认值128MB;work_mem:用于缓存排序、哈希和连接等操作的内存大小,默认值4MB;maintenance_work_mem:用于维护操作的内存大小,默认值64MB;temp_buffers:用于缓存每个数据库会话的临时表的内存大小,默认为8MB;
shared_buffer 一般推荐设置为操作系统内存的25%到50%;
work_mem 一般关注数据库中排序的需求大不大,大的话就适当调大该参数;
maintenance_work_mem 一般在做维护性操作时(如vacuum\create index\alter table add foreign key等)调整大小;一般来说这种维护性操作不会有太多并发工作存在,因此可以适当把这个值设置的大一点。
PostgreSQL允许对单个查询关闭特定的优化器特性。如果有时优化器为特定查询选择的执行计划并不是最优的,可以通过设置参数强制优化器来选择一个更好的执行计划,从而解决问题。
enable_seqscan:是否允许全表扫描;enable_indexscan:是否允许索引扫描;enable_bitmapscan:是否允许bitmap扫描;enable_tidscan:是否允许走tid扫描;enable_hashjoin:是否允许走hash连接;enable_nestloop:是否允许走nestloop连接;enable_mergejoin:是否允许走合并连接;enable_hashagg:是否允许使用hash方式计算aggregate值;enable_sort:是否允许使用显式的sort节点;enable_meterial:是否允许使用物化节点。
enable_seqscan 当全表数据量非常小或者选择性高时使用比较好。
enable_indexscan 当选择率低时使用比较好;
enable_bitmap:当多个过滤条件,并且需要扫描数据占整表比索引较大时使用比较好;
enable_tid:当指定ctid过滤条件时使用比较好;
enable_hashjoin:当数据大多数是随机时比较好;
enable_nestloop:当内外表数据量非常小时使用比较好;
enable_mergejoin:当内外表数据基本有序时使用比较好。
当一个查询涉及到的表的总数很多时,则会有无数的路径组合。为了避免产生大量的可选路径消耗CPU,采用启发式算法来搜索一定范围内的可能的访问路径。这就是基因查询优化(CEQO)。
geqo:是否允许基因查询,默认值是ON;geqo_threadol:当关系表的个数超过该值时,启用基因查询来做路径选择,默认12;gepo_effort:控制基因查询里规划时间和查询规划有效性之间的平衡,即在效率和结果之间做选择,默认为5
ge1o:关闭基因查询虽然能够得到最佳的访问路径,但是其生成执行计划的时间有可能会变得很大;
geqo_threshold:当关系表的个数少于该值的时候,优化器会穷举出所有可能的访问路径并从中选择最佳的结果;
geqo_effort:值越大,说明优化器花费更多的时间,当然选到更优的访问路径概率也更大;
cursor_tuple_fraction:用于设置规划器对将被检索的一个游标的行的比例的估计。默认值是 0.1;from_collapse_limit:影响查询优化器如何处理子查询,默认值8;join_collapse_limit:用于控制查询优化器在处理显式 JOIN 时的行为,默认值是8。
cursor_tuple_fraction:更小的值使得优化器偏向为游标快速返回第一条记录,但是可能需要很长时间来获取所有行。更大的值强调总体代价。比如设置为 1.0,游标将和普通查询完全一样地被规划,只考虑总体代价最低,而不考虑前几行会被多快地返回。
from_collapse_limit:如果生成的列表不超过这么多项,规划器将把子查询融合到上层查询。较小的值可以减少规划时间,但是可能会生成较差的查询计划。将这个值设置为geqo_threshold或更大,可能触发使用 geqo 规划器,从而产生非最优计划。
join_collapse_limit:如果查询重写生成的 from 后的项目数不超这个数,那么优化器器将把显式JOIN(除了full join)结构重写到 FROM项列表中。较小的值可减少规划时间,但是可能会生成差些的查询计划。默认情况下,这个变量被设置成和from_collapse_limit相同,这样适合大多数使用。将这个值设置为geqo_threshold或更大,可能触发使用 geqo 规划器,从而产生非最优计划。
本文内容就到这啦,阅读完本篇,相信你对PostgreSQL的这些性能参数有了更深的了解了吧!我们下篇再见!





