

# Memória do RDS para PostgreSQL
<a name="PostgreSQL.Tuning.concepts.memory"></a>

A memória do RDS para PostgreSQL está dividida em compartilhada e local.

**Topics**
+ [Memória compartilhada no RDS para PostgreSQL](#PostgreSQL.Tuning.concepts.shared)
+ [Memória local no RDS para PostgreSQL](#PostgreSQL.Tuning.concepts.local)

## Memória compartilhada no RDS para PostgreSQL
<a name="PostgreSQL.Tuning.concepts.shared"></a>

O RDS para PostgreSQL aloca memória compartilhada quando a instância é iniciada. A memória compartilhada está dividida em várias subáreas. As seções a seguir fornecem descrições das mais importantes.

**Topics**
+ [Buffers compartilhados](#PostgreSQL.Tuning.concepts.buffer-pool)
+ [Buffers de log de gravação antecipada (WAL)](#PostgreSQL.Tuning.concepts.WAL)

### Buffers compartilhados
<a name="PostgreSQL.Tuning.concepts.buffer-pool"></a>

O *grupo de buffer compartilhado* é uma área de memória do RDS para PostgreSQL que contém todas as páginas que estão ou estavam sendo utilizadas por conexões de aplicações. Uma *página* é a versão de memória de um bloco de disco. O grupo de buffer compartilhado armazena em cache os blocos de dados lidos do disco. O grupo reduz a necessidade de reler dados do disco, fazendo com que o banco de dados opere de maneira mais eficiente.

Cada tabela e índice são armazenados como uma matriz de páginas com tamanho fixo. Cada bloco contém várias tuplas, que correspondem a linhas. Uma tupla pode ser armazenada em qualquer página.

O grupo de buffer compartilhado possui memória finita. Se uma nova solicitação exigir uma página que não esteja na memória e não houver mais memória, o RDS para PostgreSQL removerá uma página utilizada com menos frequência para acomodar essa solicitação. A política de despejo é implementada por um algoritmo de varredura de relógio.

O parâmetro `shared_buffers` determina a quantidade de memória que o servidor dedica ao armazenamento em cache de dados. O valor padrão é definido como `{DBInstanceClassMemory/32768}` bytes, com base na memória disponível para a instância de banco de dados.

### Buffers de log de gravação antecipada (WAL)
<a name="PostgreSQL.Tuning.concepts.WAL"></a>

Um *buffer de log de gravação antecipada (WAL)* mantém dados de transação que o RDS para PostgreSQL grava posteriormente no armazenamento persistente. Utilizando o mecanismo WAL, o RDS para PostgreSQL pode fazer o seguinte:
+ Recupere dados após uma falha
+ Reduzir a E/S de disco, evitando gravações frequentes em disco

Quando um cliente altera dados, o RDS para PostgreSQL grava as alterações no buffer de WAL. Quando o cliente emite um `COMMIT`, o processo gravador WAL grava dados de transação no arquivo de WAL.

O parâmetro `wal_level` determina quantas informações são gravadas no WAL, com valores possíveis como `minimal`, `replica` e `logical`.

## Memória local no RDS para PostgreSQL
<a name="PostgreSQL.Tuning.concepts.local"></a>

Todo processo de backend aloca memória local para processamento de consultas.

**Topics**
+ [Área de memória de trabalho](#PostgreSQL.Tuning.concepts.local.work_mem)
+ [Área de memória de trabalho para manutenção](#PostgreSQL.Tuning.concepts.local.maintenance_work_mem)
+ [Área de buffer temporária](#PostgreSQL.Tuning.concepts.temp)

### Área de memória de trabalho
<a name="PostgreSQL.Tuning.concepts.local.work_mem"></a>

A *área de memória de trabalho*contém dados temporários para consultas que executam classificações e hashes. Por exemplo, uma consulta com uma cláusula `ORDER BY` executa uma classificação. Consultas usam tabelas de hash em agregações e junções de hash.

O parâmetro `work_mem` é a quantidade de memória a ser utilizada por operações de classificação internas e tabelas de hash antes da gravação em arquivos de disco temporários, o que é medido em megabytes. O valor padrão é 4 MB. Várias sessões podem ser executadas simultaneamente, e cada uma pode executar operações de manutenção em paralelo. Por esse motivo, a memória de trabalho total utilizada pode ser múltiplos da configuração `work_mem`. 

### Área de memória de trabalho para manutenção
<a name="PostgreSQL.Tuning.concepts.local.maintenance_work_mem"></a>

A *área de memória de trabalho para manutenção* armazena dados em cache para operações de manutenção. Essas operações incluem aspiração, criação de índices e adição de chaves externas.

O parâmetro `maintenance_work_mem` especifica a quantidade máxima de memória a ser utilizada por operações de manutenção, o que é medido em megabytes. O valor padrão é 64 MB. Uma sessão de banco de dados apenas pode executar uma operação de manutenção de cada vez.

### Área de buffer temporária
<a name="PostgreSQL.Tuning.concepts.temp"></a>

A *área de buffer temporária* armazena tabelas temporárias em cache para cada sessão de banco de dados.

Cada sessão aloca buffers temporários conforme necessário até o limite especificado. Quando a sessão termina, o servidor limpa os buffers.

O parâmetro `temp_buffers` define o número máximo de buffers temporários utilizados por cada sessão, o que é medido em megabytes. O valor padrão é de 8 MB. Antes do primeiro uso de tabelas temporárias em uma sessão, é possível alterar o valor de `temp_buffers`.