ablog

不器用で落着きのない技術者のメモ

psql で FETCH_COUNT を使って OOM Killer に kill されないようにする

Linuxpsql の実行結果をファイルに出力する際、結果セットのサイズが大きいと OS の OOM Killer に kill されることがある。
FETCH_COUNT を指定すると FETCH_COUNT 単位でメモリにキャッシュするようになる。

FETCH_COUNT の指定方法

psql -v FETCH_COUNT=1000 -A -h rs-ra3-4xl-4n.********.us-east-1.redshift.amazonaws.com -p 5439 -d dev -U awsuser
  • プロンプトで指定する
\set FETCH_COUNT 1000

参考

結論:FETCH_COUNT=Nを設定する

psql -v FETCH_COUNT=1000 

この場合、1000行毎に出力する。

元のpsqlコマンドの実行例

この場合クエリ結果は一回メモリにキャッシュされる。
そのため超大な結果を全部を一回メモリに抱えるまでファイルに出力されない。

psql -v "select * from test_table as t where t.id <> 0" > output.txt
psqlコマンドで大きな結果を逐次出力する

FETCH_COUNT
この変数が0より大きな整数値に設定されている場合、SELECT問い合わせの結果は、指定した行数の集合として取り出され、表示されます。 デフォルトの動作では、表示する前にすべての結果が取り出されます。 したがって、結果セットの大きさに関係なくメモリの使用量が限定されます。 この機能を有効とする場合に100から1000までの値がよく使用されます。 この機能を使用する際には、既に一部の行が表示されている場合、問い合わせが失敗する可能性があることに注意してください。

https://www.postgresql.jp/docs/9.4/app-psql.html