

# RDS for PostgreSQL メモリ
<a name="PostgreSQL.Tuning.concepts.memory"></a>

RDS for PostgreSQL メモリは、共有とローカルに分かれています。

**Topics**
+ [RDS for PostgreSQL の共有メモリ](#PostgreSQL.Tuning.concepts.shared)
+ [RDS for PostgreSQL のローカルメモリ](#PostgreSQL.Tuning.concepts.local)

## RDS for PostgreSQL の共有メモリ
<a name="PostgreSQL.Tuning.concepts.shared"></a>

RDS for PostgreSQL では、インスタンスの起動時に共有メモリを割り当てます。共有メモリは複数のサブエリアに分割されています。以下のセクションでは、最も重要なものについて説明します。

**Topics**
+ [共有バッファ](#PostgreSQL.Tuning.concepts.buffer-pool)
+ [ログ先行書き込み (WAL) バッファ](#PostgreSQL.Tuning.concepts.WAL)

### 共有バッファ
<a name="PostgreSQL.Tuning.concepts.buffer-pool"></a>

*共有バッファプール*は、アプリケーション接続によって使用されている、または使用されていたすべてのページを保持する RDS for PostgreSQL メモリ領域です。*ページ*は、ディスクブロックのメモリバージョンです。共有バッファプールは、ディスクから読み込まれたデータブロックをキャッシュします。プールは、ディスクからデータを再読み取りする必要性を減らし、データベースの運用効率を向上させます。

すべてのテーブルとインデックスは、固定サイズのページの配列として格納されます。各ブロックには、行に対応する複数のタプルが含まれています。タプルはどのページにも格納できます。

共有バッファプールには有限メモリがあります。新しいリクエストがメモリにないページを必要とし、メモリがもう存在しない場合、RDS for PostgreSQL は使用頻度の低いページを削除してリクエストに対応します。削除ポリシーは、クロックスイープアルゴリズムによって実装されます。

`shared_buffers`パラメータは、サーバーがデータをキャッシュするメモリ量を決定します。デフォルト値は、DB インスタンスで利用可能なメモリに基づいて `{DBInstanceClassMemory/32768}` バイトに設定されます。

### ログ先行書き込み (WAL) バッファ
<a name="PostgreSQL.Tuning.concepts.WAL"></a>

*ログ先行書き込み (WAL) バッファ*は、RDS for PostgreSQL が後で永続的ストレージに書き込むトランザクションデータを保持します。WAL メカニズムを使用すると、RDS for PostgreSQL は次のことを実行できます。
+ 障害発生後のデータリカバリ
+ ディスクへの頻繁な書き込みを回避し、ディスク I/O を削減

クライアントがデータを変更すると、RDS for PostgreSQL は WAL バッファに変更内容を書き込みます。クライアントが`COMMIT`を発すると、WAL ライタプロセスはトランザクションデータを WAL ファイルに書き込みます。

`wal_level` パラメータは、WAL に書き込む情報量を決定します。`minimal`、`replica`、`logical` などの値を設定できます。

## RDS for PostgreSQL のローカルメモリ
<a name="PostgreSQL.Tuning.concepts.local"></a>

すべてのバックエンドプロセスは、クエリ処理にローカルメモリを割り当てます。

**Topics**
+ [ワークメモリ領域](#PostgreSQL.Tuning.concepts.local.work_mem)
+ [メンテナンス作業用メモリ領域](#PostgreSQL.Tuning.concepts.local.maintenance_work_mem)
+ [テンポラリバッファ領域](#PostgreSQL.Tuning.concepts.temp)

### ワークメモリ領域
<a name="PostgreSQL.Tuning.concepts.local.work_mem"></a>

*ワークメモリ領域*ソートとハッシュを実行するクエリのテンポラリデータを保持します。例えば、`ORDER BY`文節を持つクエリはソートを実行します。クエリは、ハッシュ結合と集約でハッシュテーブルを使用します。

`work_mem` パラメータは、一時ディスクファイルに書き込む前に、内部のソートオペレーションとハッシュテーブルで使用するメモリ量 (メガバイト単位) を指定します。デフォルト値は 4 MB です。複数のセッションを同時に実行でき、各セッションでメンテナンスオペレーションを並行して行うことができます。このため、使用されるワークメモリの合計は、`work_mem`設定の何倍にもなることがあります。

### メンテナンス作業用メモリ領域
<a name="PostgreSQL.Tuning.concepts.local.maintenance_work_mem"></a>

*メンテナンス作業用メモリ領域*は、メンテナンスオペレーション用のデータをキャッシュします。これらの操作には、バキューム処理、インデックス作成、外部キーの追加が含まれます。

`maintenance_work_mem` パラメータは、メンテナンスオペレーションで使用するメモリの最大量 (メガバイト単位) を指定します。デフォルト値は 64 MB です。データベースセッションでは、一度に 1 つのメンテナンスオペレーションしか実行できません。

### テンポラリバッファ領域
<a name="PostgreSQL.Tuning.concepts.temp"></a>

*テンポラリバッファ領域*は、データベースセッションごとにテンポラリテーブルをキャッシュします。

各セッションは、指定した制限まで、必要に応じてテンポラリバッファを割り当てます。セッションが終了すると、サーバーはバッファをクリアします。

`temp_buffers` パラメータは、各セッションで使用する一時バッファの最大数 (メガバイト単位) を設定します。デフォルト値は 8 MB です。セッション内でテンポラリテーブルを初期に使用する前に、`temp_buffers`値を変更できます。