[运营交流]
Postgresql性能优化之work_mem参数
work_mem参数
该参数是postgresql每个进程可以使用的工作内存空间。如果进程需要的容量超过了这个范围,就要把处理内容输出到临时文件里,相当于OS的swap处理。
查询时如果用到了排序,哈希关联,bitmap检索等方式的话,就要分别利用work_mem的内存空间。也就是一个SQL语句可能会同时使用多个工作内存空间,而不是共用一个。
设置这个参数的时候,就要考虑到同时连接数以及每个连接平均使用的内存空间数。总内存数减去 (同时连接数”平均使用数的总和),剩下的才是OS和postgresql可以利用的缓存。(参考值,不是绝对值) 设置的太大的话,反倒会引起OS的swap,影响性能。
正确设置work_mem的方法如下:
1) psql连接数据库
2)database=# set client_min_messages='LOG';
3) database=# set log_temp_files = 0; //显示所有使用临时文件的日志
4) 执行比较慢的SQL语句
5) 如果显示了类似下列的日志的话,就要加大work_mem的值,然后重复第五步
LOG: temporary file: path "base/pgsql_tmp/pgsql_tmp27660.1568", size 88155700
修改这个参数不用重启数据库,reload一下就可以了。
最好先执行一下SQL语句,把需要的资源全部放到缓存里,然后再调试,可以排除IO的影响。