ぱと隊長日誌

ブログ運用もエンジニアとしての生き方も模索中

PostgreSQL の一時バッファはセッションを終了するまで解放されない

PostgreSQL 13 のマニュアルから temp_buffers の説明を引用します。

temp_buffers (integer)
それぞれのデータベースセッションが使用する一時バッファの最大メモリ量を設定します。一時バッファは、一時テーブルにアクセスする時にのみ使用されるセッションローカルのバッファです。

19.4. 資源の消費

「セッションローカル」との説明からはセッションが終了するまで一時バッファとして確保されるとも読めます。

一方で、一時テーブルはトランザクションの終わりに自動削除することもできます。

TEMPORARYまたはTEMP
このパラメータが指定された場合、テーブルは一時テーブルとして作成されます。一時テーブルは、そのセッションの終わり、場合によっては、現在のトランザクションの終わり(後述のON COMMITを参照)に自動的に削除されます。

CREATE TABLE

一時テーブルが削除されれば、確保された一時バッファも解放されるのかを確認しました。

なお、結論を先に申し上げると、一時バッファの開放はセッション終了時となります。一時テーブルの削除タイミングやトランザクションの終了タイミングではありません。

PostgreSQL 14.2 で検証しました。また、PostgreSQL 10.20 でも同様の結果となることを確認しました。

psql で以下のコマンドを順番に実行します。コメントのある行ではメモリの使用量を測定します。free コマンドの Mem: 行 used 列の値を読み取ります。

-- 1GB と 2GB で検証する
=# SET temp_buffers = '1GB';

=# BEGIN;

=# CREATE TEMPORARY TABLE tab(c1 INTEGER) ON COMMIT DROP;  -- (1)

=# INSERT INTO tab SELECT generate_series(1, 1e+8);  -- (2)

=# COMMIT;  -- (3)

=# \q  -- (4)
測定 メモリ使用量(1GB設定) メモリ使用量(2GB設定)
(1) 166 [MB] 161 [MB]
(2) 1207 [MB] 2245 [MB]
(3) 1210 [MB] 2246 [MB]
(4) 166 [MB] 162 [MB]

この検証結果から以下のことが分かりました。

  • COMMIT で一時テーブルが削除されてもメモリ使用量は減らない(解放されない)
  • トランザクションが終了してもメモリ使用量は減らない(解放されない)
  • セッション終了時にメモリ使用量が減る(解放される)