postgresql实战—进程及内存
当从数据库中检索数据时有两种典型的访问方法,顺序扫描和B树索引扫描,顺序扫描通过扫描每个页面中的所有行指针顺序读取所有页面中的所有元组。B树索引扫描时,索引文件包含索引元组,每个元组由索引健和指向目标堆元组的TID组成,如果找到了正在查找的键的索引元组,Postgresql使用获取的TID值读取所需的元组。
psql是一用户一进程的客户端/服务器的应用程序。数据库启动时会启动若干个进程,其中有postmaster(守护进程)、postgres(服务进程)、syslogger、checkpointer、bgwriter、walwriter等辅助进程。
postmaster进程职责:
数据库的启停
监听客户端连接
为每个客户端连接fork(分支)单独postgres服务进程
当服务进程出错时进行修复
管理数据文件
管理与数据库运行相关的辅助进程
psql的内存分为两大类:本地内存和共享内存。本地内存由每个后端服务进程分配以供自己使用,当后端服务进程被fork时,每个后端进程为查询分配一个本地内存区域
本地内存由三部分组成
wok_mem:当使用order by或distinct操作对元组进行排序时会使用这部分内存
maintenance_work_mem:维护操作,例如VACUUM、REINDEX、CREEATE INDEX等操作使用这部分内存
temp_buffers:临时表相关操作使用这部分内存
共享内存在psql服务器启动时分配,由所有后端进程共同使用
shared buffer pool:psql将表和索引中的页面从持久存储装载到这里,并直接操作它们
WAL buffer:WAL文件持久化之前的缓冲区
CommitLog buffer:psql在Commit Log中保存事务的状态,并将这些状态保留在共享内存缓冲区中,在整个事务处理过程中使用
psql9.6版本前还不支持并行查询,sql无法利用多核CPU提升性能
9.6版本开始支持并行查询,9.6版本的并行查询所支持的范围非常有限,例如只在顺序扫描、多表关联、聚合查询中支持并行
max_work_progress(integer)
设置系统的最大后台进程数,默认为8。如果有备库,备库上此参数必须大于或等于主库上的此参数配置值,此参数调整后需重启数据库生效
max_parallel_works
设置系统支持的并行查询进程数
max_parallel_works_per_gather
设置允许启用的并行进程的进程数,0表示禁用并行查询
parallel_setup_cost:设置优化器启动并行进程的成本
parallel_tuple_cost:设置优化器通过并行进程处理一行数据的成本
psql10对并行扫描的支持将提升范围扫描SQL的性能,由于开启并行将消耗更多的CPU、内存、IO资源,设置并行进程数时得合理考虑
目前psql10暂不支持非btree索引类型的并行索引扫描
index- only扫描是指只需扫描索引,仅根据索引就能获得所需检索的数据,而不需要通过索引回表查询数据