🤖
psqlコマンドで大きな結果を逐次出力する
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