在PostgreSQL内存结构中,主要分为本地缓冲区(Local Memory Area)和共享缓冲区(hared Memory Area)两部分, 本文主要介绍这两种缓冲区的功能。
本地缓冲区
当连接建立时, postgres都会为每一个backend process分配Local Memory Area,可以分为三个子区域, 如下表所示:
| 子区域 | GUC参数 | 默认值 | 描述 |
|---|---|---|---|
| Work Memory | work_mem | 4MB | 指定在写到临时磁盘文件之前被内部排序操作和哈希表使用的内存量, ORDER BY、DISTINCT和归并连接都要用到排序操作。哈希连接、基于哈希的聚集以及基于哈希的IN子查询处理中都要用到哈希表。 |
| Maintenance Work Memory | maintenance_work_mem | 64MB | 指定在维护性操作(如VACUUM,CREATE INDEX和ALTER TABLE ADD FOREIGN KEY等)中使用的最大的内存量。 |
| Temp Buffers | temp_buffers | 8MB | 设置每个数据库会话使用的临时缓冲区的最大数目,只用于访问临时表。可以在独立的会话内部被改变,但是只有在会话第一次使用临时表之前才能改变, 在会话中随后企图改变该值是无效的。 |
| Vacuum Buffers | autovacuum_work_mem | -1 | 指定每个vacuum worker进程能使用的最大内存量。其默认值-1,表示使用maintenance_work_mem的值。这个设置对正在运行VACUUM的没有影响。 |
共享缓冲区
这块区域在服务器启动的时候分配
| 子区域 | 参数 | 默认值 | 描述 |
|---|---|---|---|
| Shared Buffers | shared_buffers | 128MB | 设置数据库服务器将使用的共享内存缓冲区量。通常设置为25%-40%比较合适。默认block_size下,至少为128千字节(KB) |
| WAL Buffers | wal_buffers | 16MB | 用于还未写入磁盘的 WAL 数据的共享内存量。默认值-1表示选择等于shared_buffers的1/32的尺寸(约3%),但是不小于64kB也不大于WAL段的尺寸(通常为16MB)。任何小于32kB的正值都将被当作32kB。 |
| CLOG Buffers | 存储了所有表明事物提交状态的元数据。 | ||
| Memory for Locks Space | max_locks_per_transaction max_pred_locks_per_transaction | 64 | 存储所有PostgreSQL实例所有heavyweight locks信息,这些锁信息被所有的background process和backend process共享。 |


