

# RDS for PostgreSQL 内存


RDS for PostgreSQL 内存分为共享内存和本地内存。

**Topics**
+ [

## RDS for PostgreSQL 中的共享内存
](#PostgreSQL.Tuning.concepts.shared)
+ [

## RDS for PostgreSQL 中的本地内存
](#PostgreSQL.Tuning.concepts.local)

## RDS for PostgreSQL 中的共享内存


RDS for PostgreSQL 会在实例启动时分配共享内存。共享内存分为多个子区域。以下各节提供了最重要子区域的说明。

**Topics**
+ [

### 共享缓冲区
](#PostgreSQL.Tuning.concepts.buffer-pool)
+ [

### 预写日志 (WAL) 缓冲区
](#PostgreSQL.Tuning.concepts.WAL)

### 共享缓冲区


*共享缓冲池*是一个 RDS for PostgreSQL 内存区域，它包含应用程序连接现在正在使用或过去使用的所有页面。*分页*是磁盘数据块的内存版本。共享缓冲池缓存从磁盘读取的数据块。该缓冲池减少了从磁盘重新读取数据的需求，从而提高了数据库的运行效率。

每个表和索引都存储为固定大小的页面数组。每个数据块包含多个元组，它们与行相对应。元组可以存储在任何页面中。

共享缓冲池的内存有限。如果新请求需要一个不在内存中的页面，并且没有更多的内存，RDS for PostgreSQL 会移除一个较少使用的页面来容纳请求。移出策略通过时钟扫描算法来实现。

`shared_buffers` 参数确定服务器用于缓存数据的内存量。根据数据库实例的可用内存，默认值设置为 `{DBInstanceClassMemory/32768}` 字节。

### 预写日志 (WAL) 缓冲区


*预写日志（WAL）缓冲区*保存 RDS for PostgreSQL 稍后写入持久存储的事务数据。使用 WAL 机制，RDS for PostgreSQL 可以执行以下操作：
+ 发生故障后恢复数据
+ 通过避免频繁写入磁盘来减少磁盘输入/输出

当客户端更改数据时，RDS for PostgreSQL 会将更改写入 WAL 缓冲区。当客户发出 `COMMIT`，WAL 写入器进程将事务数据写入 WAL 文件。

`wal_level` 参数决定向 WAL 写入的信息量，可能的值包括 `minimal`、`replica` 和 `logical` 等。

## RDS for PostgreSQL 中的本地内存


每个后端进程都会为查询处理分配本地内存。

**Topics**
+ [

### 工作内存区域
](#PostgreSQL.Tuning.concepts.local.work_mem)
+ [

### 维护工作内存区域
](#PostgreSQL.Tuning.concepts.local.maintenance_work_mem)
+ [

### 临时缓冲区
](#PostgreSQL.Tuning.concepts.temp)

### 工作内存区域


*工作内存区域*保存执行排序和哈希的查询的临时数据。例如，包含 `ORDER BY` 子句的查询执行排序。查询在哈希联接和聚合中使用哈希表。

`work_mem` 参数表示在写入临时磁盘文件之前，内部排序操作和哈希表要使用的内存量，以 MB 为单位。原定设置值为 4MB。可以同时运行多个会话，且每个会话可以并行运行维护操作。出于这个原因，使用的总工作内存可以是 `work_mem` 设置的倍数。

### 维护工作内存区域


*维护工作内存区域*缓存数据以进行维护操作。这些操作包括 vacuum 操作、创建索引和添加外键。

`maintenance_work_mem` 参数指定维护操作要使用的最大内存量，以 MB 为单位。原定设置值为 64MB。一个数据库会话一次只能运行一个维护操作。

### 临时缓冲区


*临时缓冲区*缓存每个数据库会话的临时表。

每个会话都根据需要分配临时缓冲区，但不超过您指定的限制。当会话结束时，服务器将清除缓冲区。

`temp_buffers` 参数设置每个会话使用的临时缓冲区的最大数量，以 MB 为单位。默认值为 8 MB。在会话中首次使用临时表之前，您可以更改 `temp_buffers` 值。