PostgreSQL の一時バッファはセッションを終了するまで解放されない
PostgreSQL 13 のマニュアルから temp_buffers の説明を引用します。
temp_buffers (integer)
19.4. 資源の消費
それぞれのデータベースセッションが使用する一時バッファの最大メモリ量を設定します。一時バッファは、一時テーブルにアクセスする時にのみ使用されるセッションローカルのバッファです。
「セッションローカル」との説明からはセッションが終了するまで一時バッファとして確保されるとも読めます。
一方で、一時テーブルはトランザクションの終わりに自動削除することもできます。
TEMPORARYまたはTEMP
CREATE TABLE
このパラメータが指定された場合、テーブルは一時テーブルとして作成されます。一時テーブルは、そのセッションの終わり、場合によっては、現在のトランザクションの終わり(後述のON COMMITを参照)に自動的に削除されます。
一時テーブルが削除されれば、確保された一時バッファも解放されるのかを確認しました。
なお、結論を先に申し上げると、一時バッファの開放はセッション終了時となります。一時テーブルの削除タイミングやトランザクションの終了タイミングではありません。
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 で一時テーブルが削除されてもメモリ使用量は減らない(解放されない)
- トランザクションが終了してもメモリ使用量は減らない(解放されない)
- セッション終了時にメモリ使用量が減る(解放される)