🤖

psqlコマンドで大きな結果を逐次出力する

2023/08/07に公開

psqlのコマンドを使ってSQLを発行した時に、超大な結果が返却されるケースでハマったので対応について記載します。

結論: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コマンドの実行例

この場合は1000行毎にファイルに出力される。
そのためメモリを大量には使用しない。

psql -v FETCH_COUNT=1000 "select * from test_table as t where t.id <> 0" > output.txt

まとめ

コマンドラインから大きいデータを扱う場合にハマることがおおいですが、psqlもmysqlもデフォルトでは一回結果を全部をメモリに抱える動作なので、100万ぐらいでよいので、上限つけておいた方が親切だったかもと思う今日このごろです。

Discussion