PostgreSQL 配置内存参数

对于任何数据库软件,内存配置项都是很重要的配置项。在 PostgreSQL 主要有如下几个内存配置参数。数据库

shared_buffers: integer 类型,设置数据库服务器将使用的共享内存缓冲区数量,此缓冲区为缓冲数据块所用。此缓冲区是放在共享内存中的。每一个缓冲区大小的典型值是 8K 字节,默认值一般是 4000,对于 8KB 的数据块则共享内存缓冲区大小为 400*8KB=32MB。这个数值必须大于 16,而且至少是 max_connections 数值的两倍。一般都会把此值设置的大一些,这样能够改进性能。通常设置为物理内存的 25%,若把 shared_buffers 设置的更大,如超过物理内存的 40%,就会发现缓冲的效果并不明显了,这是由于 PostgreSQL 是运行文件系统之上的,若文件系统也有缓存,将致使双缓存过多,形成负面影响。缓存

 

temp_buffers: integer 类型,设置每一个数据库会话使用的临时缓冲区的最大数目。此本地缓冲区只用于访问临时表。临时缓冲区是在某个链接会话的服务进程中分配的,属于本地内存。临时缓冲区的大小也是按数据块大小分配的,默认是 1000,对于 8K 的数据块大小为 8MB。安全

 

work_mem: integer 类型,声明内部排序操做和 Hash 表在开始使用临时磁盘文件以前可以使用的内存数目。这个内存也是本地内存,默认是 1MB。请注意对于复杂的查询,可能会同时并发运行好几个排序或散列(hash)操做;每一个排序或散列操做都会分配这个参数声明的内存来存储中间数据,只有存不下才会使用临时文件。一样,好几个正在运行的会话可能会同时进行排序操做,所以使用的总内存量多是 work_mem 的好几倍。 ORDER BY、DISTINCT 和 MERGE JOINS 都要用到排序操做。Hash 表在以 Hash join、Hash 为基础的汇集、以 Hash 为基础的 IN 子查询处理中都要用到。服务器

 

maintenance_work_mem: integer 类型,声明在维护性操做(好比 CACUUM、CREATE INDEX、ALTER TABLE ADD FOREIGN KEY等)中使用的最大内存数。默认是 16 MB。在一个数据库会话里,只有一个这样的操做能够执行行,而且一个数据库实例一般不会有太多这样的工做并发执行,把这个数值设置得比 work_mem 大一些一般是合适的。更大的设置能够提升上述操做的速度。并发

 

max_stack_depth: integer 类型,声明服务器执行堆栈的最大安全深度。默认值 2MB。若是发现不能运行复杂的函数,能够适当提升此配置的值,不过一般状况下保持默认值就够了。函数

把 max_stack_depth 参数设置得大于实际的操做系统内核限制值时,意味着一个正在运行的递归函数可能会致使 PostgreSQL 后台服务进程奔溃。在一些操做系统平台上,PG 可以检测出内核限制,这时它将不容许将其设置为一个不安全的值。但PG并不能在全部操做系统的平台都检测它的限制值,因此仍是建议设置一个明确的值。性能

 

 


 

总结:

shared_buffers:共享内存的大小,主要用于共享内存数据块。spa

work_mem:单个 SQL 执行时,排序、hash join 所使用的内存,SQL 运行完成后,内存就释放了。操作系统

 

shared_buffers 默认值为 32 MB,work_mem 为 1MB,若是你的机器上有足够的内存,能够把这个参数改得大一些,排序

这样数据库就能够缓存更多的数据块,当读取数据时,就能够从共享内存中读,而不须要再从文件上去读取。

 

work_mem 设置大一些,会让排序操做快一些。

相关文章
相关标签/搜索