当您通过数据库统计信息、慢SQL等信息了解数据库当前的状态以及存在的问题后,可以针对发现的问题,进行调整和优化。PolarDB PostgreSQL版(兼容Oracle)默认的参数模板适用于大多数通用的数据库场景,对于一些特殊的数据库场景,默认模板可能无法满足需求,您可以通过调整相关的数据库参数,对集群性能进行优化。

资源消耗参数

参数名参数说明
shared_buffers数据库使用的共享内存大小,越大的缓存区可以缓存的数据更多,PolarDB中该值与规格相关。
work_mem指定在写到临时磁盘文件之前被内部排序操作和哈希表使用的内存量。注意对于一个复杂查询, 可能会并行运行好几个排序或者哈希操作;每个操作都会被允许使用这个参数指定的内存量,然后才会开始写数据到临时文件。同样,几个正在运行的会话可能并发进行这样的操作。因此被使用的总内存可能是work_mem值的好几倍,在选择这个值时一定要记住这一点。ORDER BY、DISTINCT和归并连接都要用到排序操作。哈希连接、基于哈希的聚集以及基于哈希的IN子查询处理中都要用到哈希表。
maintenance_work_mem

指定在维护性操作(例如VACUUM、CREATE INDEX和ALTER TABLE ADD FOREIGN KEY)中使用的最大的内存量。因为在一个数据库会话中,一个时刻只有一个这样的操作可以被执行,并且一个数据库安装通常不会有太多这样的操作并发执行, 把这个数值设置得比work_mem大很多是安全的。 更大的设置可以改进清理和恢复数据库转储的性能。

注意当自动清理运行时,可能会分配最多达这个内存的autovacuum_max_workers倍,因此要小心不要把该默认值设置得太高。 通过独立地设置autovacuum_work_mem可能会对控制这种情况有所帮助。

autovacuum_work_mem指定每个自动清理工作者进程能使用的最大内存量。其默认值为 -1,表示使用maintenace_work_mem的值。
temp_file_limit指定一个进程能用于临时文件(如排序和哈希临时文件,或者用于保持游标的存储文件)的最大磁盘空间量。一个试图超过这个限制的事务将被取消。这个值以千字节计,-1意味着没有限制。
max_worker_processes设置系统能够支持的后台进程的最大数量。这个参数只能在服务器启动时设置。
max_parallel_workers设置系统为并行操作所支持的工作者的最大数量。要注意将这个值设置得大于max_worker_processes将不会产生效果。注意并行查询可能消耗比非并行查询更多的资源,因为每一个工作者进程时一个完全独立的进程,它对系统产生的影响大致和一个额外的用户会话相同。
max_parallel_workers_per_gather设置单个Gather或者Gather Merge节点能够开始的工作者的最大数量。并行工作者会从max_worker_processes建立的进程池获取,数量由max_parallel_workers限制。
max_parallel_maintenance_workers设置CREATE INDEX并行工作的最大数量。

autovacuum相关参数

参数说明
autovacuum_max_workers指定能同时运行的自动清理进程(除了自动清理启动器之外)的最大数量。默认值为3。该参数只能在服务器启动时设置。
autovacuum_naptime指定自动清理在任意给定数据库上运行的最小延迟。在每一轮中后台进程检查数据库并根据需要为数据库中的表发出VACUUM和ANALYZE命令。延迟以秒计,且默认值为1分钟(1min)。
autovacuum_vacuum_threshold指定能在一个表上触发VACUUM的被插入、被更新或被删除元组的最小数量。默认值为50个元组。可以通过修改表存储参数来覆盖该设置。
autovacuum_analyze_threshold指定能在一个表上触发ANALYZE的被插入、被更新或被删除元组的最小数量。默认值为50个元组。可以通过修改表存储参数来覆盖该设置。
autovacuum_vacuum_scale_factor指定一个表尺寸的分数,在决定是否触发VACUUM时将它加到autovacuum_vacuum_threshold上。默认值为0.05(表尺寸的5%)。可以通过修改表存储参数来覆盖该设置。
autovacuum_analyze_scale_factor指定一个表尺寸的分数,在决定是否触发ANALYZE时将它加到autovacuum_analyze_threshold上。默认值为0.1(表尺寸的10%)。可以通过修改表存储参数来覆盖该设置。
autovacuum_vacuum_cost_delay指定用于自动VACUUM操作中的代价延迟值。如果指定-1(默认值),则使用vacuum_code_delay值。可以通过修改表存储参数来覆盖该设置。
autovacuum_vacuum_cost_limit指定用于自动VACUUM操作中的代价限制值。如果指定-1(默认值),则使用vacuum_cost_limit值。注意该值被按比例地分配到运行中的自动清理工作者上(如果有多个),因此每一个工作者的限制值之和不会超过这个变量中的值。可以通过修改表存储参数来覆盖该设置。

查询规划参数

以下参数不建议全局修改,当您在测试特定的查询时,在当前会话中修改。

参数参数说明
enable_bitmapscan允许或禁止查询规划器使用位图扫描计划类型。
enable_hashagg允许或禁用查询规划器使用哈希聚集计划类型。
enable_hashjoin允许或禁止查询规划器使用哈希连接计划类型。
enable_indexscan允许或禁止查询规划器使用索引扫描计划类型。
enable_indexonlyscan允许或禁止查询规划器使用只用索引扫描计划类型。
enable_seqscan允许或禁止查询规划器使用顺序扫描计划类型。它不可能完全禁止顺序扫描,但是关闭这个变量将使得规划器尽可能优先使用其他方法。
enable_sort允许或禁止查询规划器使用显式排序步骤。它不可能完全禁止显式排序,但是关闭这个变量将使得规划器尽可能优先使用其他方法。
enable_mergejoin允许或禁止查询规划器使用归并连接计划类型。
enable_nestloop允许或禁止查询规划器使用嵌套循环连接计划。它不可能完全禁止嵌套循环连接,但是关闭这个变量将使得规划器尽可能优先使用其他方法。
enable_parallel_append允许或禁止查询规划器使用并行追加计划类型。
enable_parallel_hash允许或禁止查询规划器对并行哈希使用哈希连接计划类型。如果哈希连接计划也没有启用,这个参数没有效果。

规划器代价参数

参数参数说明
seq_page_cost设置规划器计算一次顺序磁盘页面抓取的开销。默认值是1.0。
random_page_cost设置规划器对一次非顺序获取磁盘页面的代价估计。默认值是 4.0。
cpu_tuple_cost设置规划器对一次查询中处理每一行的代价估计。默认值是 0.01。
cpu_index_tuple_cost设置规划器对一次索引扫描中处理每一个索引项的代价估计。默认值是 0.005。
cpu_operator_cost设置规划器对于一次查询中处理每个操作符或函数的代价估计。默认值是 0.0025
parallel_setup_cost设置规划器对启动并行工作者进程的代价估计。默认是 1000。
parallel_tuple_cost设置规划器对于从一个并行工作者进程传递一个元组给另一个进程的代价估计。默认是 0.1。
min_parallel_table_scan_size为必须扫描的表数据量设置一个最小值,扫描的表数据量超过这一个值才会考虑使用并行扫描。对于并行顺序扫描,被扫描的表数据量总是等于表的尺寸,但是在使用索引时,被扫描的表数据量通常会更小。默认值是8MB。
min_parallel_index_scan_size为必须扫描的索引数据量设置一个最小值,扫描的索引数据量超过这一个值时才会考虑使用并行扫描。注意并行索引扫描通常并不会触及整个索引,它是规划器认为该扫描会实际用到的相关页面的数量。默认值是512KB。

PolarDB调整参数

表 1. pg_setting详解
列名解释
namevacuum_cost_delay参数名称
setting10参数当前值
unitms参数的单位
categoryResource Usage / Cost-Based Vacuum Delay参数类别
short_descVacuum cost delay in milliseconds.参数描述
extra_desc附加详细描述
contextuser设置参数值的上下文
vartypeinteger参数类型(bool、enum、integer、real、string)
sourcedatabase参数值来源
min_val0参数允许最小值
max_val100参数允许最大值
enumvals枚举参数的允许值
boot_val0没有设置时,启动时的设定值
reset_val10会话中reset时设定的值
sourcefile当前值设置的配置文件
sourceline当前设置的配置文件的行号
pending_restartf修改该参数需要重启为true,否则为false

PolarDB资源消耗参数

参数名参数说明
shared_buffers数据库使用的共享内存大小,越大的缓存区,缓存的数据更多,PolarDB中该值与规格相关。
work_mem指定在写到临时磁盘文件之前被内部排序操作和哈希表使用的内存量注意对于一个复杂查询, 可能会并行运行好几个排序或者哈希操作;每个操作都会被允许使用这个参数指定的内存量,然后才会开始写数据到临时文件。同样,几个正在运行的会话可能并发进行这样的操作。因此被使用的总内存可能是work_mem值的好几倍,在选择这个值时一定要记住这一点。ORDER BY、DISTINCT和归并连接都要用到排序操作。哈希连接、基于哈希的聚集以及基于哈希的IN子查询处理中都要用到哈希表。
maintenance_work_mem

指定在维护性操作(例如VACUUM、CREATE INDEX和ALTER TABLE ADD FOREIGN KEY)中使用的最大的内存量。因为在一个数据库会话中,一个时刻只有一个这样的操作可以被执行,并且一个数据库安装通常不会有太多这样的操作并发执行, 把这个数值设置得比work_mem大很多是安全的。 更大的设置可以改进清理和恢复数据库转储的性能。

注意当自动清理运行时,可能会分配最多达这个内存的autovacuum_max_workers倍,因此要小心不要把该默认值设置得太高。 通过独立地设置autovacuum_work_mem可能会对控制这种情况有所帮助。

autovacuum_work_mem指定每个自动清理工作者进程能使用的最大内存量。其默认值为 -1,表示使用maintenace_work_mem的值。
temp_file_limit指定一个进程能用于临时文件(如排序和哈希临时文件,或者用于保持游标的存储文件)的最大磁盘空间量。一个试图超过这个限制的事务将被取消。这个值以千字节计,-1意味着没有限制。