私は約800GBの巨大なデータベースを持っています。特定の変数をグループ化して結果を集計するクエリを実行しようとすると、数時間実行した後に停止していました。 Postgresは、ディスク容量がいっぱいであるというメッセージをスローしていました。統計を調べた後、dBには約400GBの一時ファイルがあることがわかりました。これらの一時ファイルは、クエリの実行中に作成されたものだと思います。私の質問は、これらの一時ファイルを削除するにはどうすればよいですか。また、このような問題を回避するにはどうすればよいですか?カーソルまたはforループを使用して、すべてのデータを一度に処理しないようにしますか?ありがとう。
Postgres9.2を使用しています
クエリの実行中にbase/pgsql_tmp
に作成された一時ファイルは、クエリが完了すると削除されます。手作業で削除しないでください。
これらのファイルは一時テーブルとは関係がなく、work_mem
に収まらない大きなハッシュまたはソート操作のデータを格納するために使用されます。
クエリが終了またはキャンセルされたことを確認し、CHECKPOINT
を2回続けて実行して、ファイルがまだ存在するかどうかを確認します。はいの場合、それはバグです。ディスク容量が不足したときにPostgreSQLサーバーがクラッシュしましたか?
base/pgsql_tmp
に自動的に削除されない古いファイルがある場合は、手動で削除しても安全だと思います。しかし、その場合はPostgreSQLにバグを報告します。
実行プランで大きな結果セットを並べ替える必要がある場合、または大きなハッシュを作成する必要がある場合は、大きな一時ファイルを回避する方法はありません。カーソルはそこでは役に立ちません。 for-loopsの場合、データベースからアプリケーションコードに処理を移動することを意味すると思います。これは通常間違いであり、データベースから処理の効率が低い別の場所に問題を移動するだけです。
大きな結果セットを並べ替えたりハッシュしたりする必要がないようにクエリを変更します(EXPLAIN
で確認してください)。それはあまり役に立たないように聞こえますが、これ以上の方法はありません。とにかくそれをしなければならないでしょう、それとも数時間のランタイムがあなたに受け入れられますか?