为了保证数据库尽可能高性能地运行,建议依据硬件资源情况和业务实际进行数据库系统参数——GUC参数的设置。
数据库内存参数调优
数据库的复杂查询语句性能非常强的依赖于数据库系统内存的配置参数。数据库系统内存的配置参数主要包括逻辑内存管理的控制参数和执行算子是否下盘的参数。
逻辑内存管理参数
逻辑内存管理参数为max_process_memory,主要功能是控制数据库节点上可用内存的最大峰值,该参数的数值设置公式参考max_process_memory。
执行作业最终可用的内存为:
max_process_memory – shared memory ( 包括shared_buffers ) – cstore_buffers
所以影响执行作业可用内存参数的主要两个参数为shared_buffers及cstore_buffers。
逻辑内存管理有专门的视图查询数据库节点中各大块内存区域已使用内存及峰值信息。可连接到单个数据库节点,通过"pg_total_memory_detail"查询该节点上内存区域信息;或者连接到数据库主节点,通过"pgxc_total_memory_detail"查询节点上内存区域信息。
参数work_mem依据查询特点和并发来确定,一旦work_mem限定的物理内存不够,算子运算数据将写入临时表空间,带来5-10倍的性能下降,查询响应时间从秒级下降到分钟级。
- 对于串行无并发的复杂查询场景,平均每个查询有5-10关联操作,建议work_mem=50%内存/10。
- 对于串行无并发的简单查询场景,平均每个查询有2-5个关联操作,建议work_mem=50%内存/5。
- 对于并发场景,建议work_mem=串行下的work_mem/物理并发数。
执行算子是否下盘的参数
参数work_mem可以判断执行作业可下盘算子是否已使用内存量触发下盘点。当前可下盘算子有六类(向量化及非向量化共10种): Hash(VecHashJoin),Agg(VecAgg),Sort(VecSort),Material(VecMaterial),SetOp(VecSetOp),WindowAgg(VecWindowAgg)。该参数设置通常是一个权衡,即要保证并发的吞吐量,又要保证单查询作业的性能,故需要根据实际执行情况(结合Explain Performance输出)进行调优。
数据库并发队列参数调优
数据库提供两种手段进行并发队列的控制,全局并发队列和局部并发队列。
全局并发队列
全局并发队列采用GUC参数max_active_statements控制数据库主节点上运行并发执行的作业数量。采用全局并发队列机制将控制所有普通用户的执行作业,不区分复杂度,即执行语句都将作为一个执行单元,当并发执行的作业数量达到此参数阈值时,将进入队列等待。对于管理员执行的作业,不走全局并发控制逻辑。
设置该GUC参数数值时,需要考虑系统的承受能力,主要关注内存的使用情况及IO的使用情况,综合判断。若普通用户关联资源池,并且资源池中的优先级比例不同,全局并发队列在数据库内部将使用两维队列,即优先级高低排队和同一优先级进行排队。在唤醒时,将优先唤醒高优先级队列的作业。
说明:
- 在事务类大并发业务场景下,参数max_active_statements建议设置为-1,即不限制全局并发数。
- 在分析类查询的场景下,参数max_active_statements的值设置为CPU的核数除以数据库节点个数,一般可以设置5~8个。
局部并发队列
采用资源池局部并发控制机制的目的是控制在数据库主节点上同一资源池内的并发作业数量。局部并发控制机制根据执行作业的cost,控制复杂查询的并发作业数量。
参数parctl_min_cost数值用于判断执行作业是否是复杂作业。




