web-dev-qa-db-ja.com

PostgreSQLの一時テーブル

クエリを250万回実行する必要があります。このクエリは、AVG(column)が必要な行を生成し、このAVGを使用して、平均以下のすべての値からテーブルをフィルタリングします。次に、これらのフィルタリングされた結果をテーブルにINSERTする必要があります。

合理的な効率でこのようなことを行う唯一の方法は、TEMPORARY TABLE各query-postmaster python-threadに対して。これらのTEMPORARY TABLEsはハードドライブに永続的に保存されず、もちろん作業メモリが不足している場合を除き、メモリ(RAM)に残ります。

TEMPORARY TABLEがディスク書き込みを引き起こすかどうかを知りたい(これはINSERTSに干渉する、つまりプロセス全体が遅くなる)

66

Postgresでは、一時テーブルのデフォルトの動作は自動的に削除されず、コミット時にデータが保持されることに注意してください。 ON COMMIT を参照してください。

ただし、一時テーブルは データベースセッションの終了時に削除されます

一時テーブルは、セッションの終了時に、またはオプションで現在のトランザクションの終了時に自動的に削除されます。

考慮する必要がある複数の考慮事項があります。

  • トランザクションの最後に一時テーブルを明示的にDROPしたい場合は、CREATE TEMPORARY TABLE ... ON COMMIT DROP構文で作成します。
  • 接続プーリングが存在する場合、データベースセッションは複数のクライアントセッションにまたがることがあります。 CREATEの衝突を避けるために、一時テーブルを削除する必要があります-接続をプールに返す前に(たとえば、トランザクション内ですべてを実行し、ON COMMIT DROP作成構文を使用して)、or必要に応じて(CREATE TEMPORARY TABLEステートメントの前に、対応するDROP TABLE IF EXISTSを付けることにより、たとえば接続が自動コミットモードで使用されます。)
  • 一時テーブルが使用されている間、ディスクにオーバーフローする前にどのくらいメモリに収まりますか? temp_buffersの-​​ postgresql.conf オプションを参照してください
  • 一時テーブルを頻繁に使用する場合、他に心配すべきことはありますか?一時テーブルを削除した後、カタログから不要なタプルをクリーンアップするために、バキュームをお勧めします。デフォルト設定(auto_vacuum)を使用すると、Postgresは3分ごとに自動的にバキュームします。

また、あなたの質問とは無関係です(ただし、おそらくあなたのプロジェクトに関連しています):一時テーブルに対してクエリを実行する必要がある場合after、それを入力したことに注意してください適切なインデックスを作成し、問題の一時テーブルでANALYZEを発行することをお勧めしますafter挿入が完了しました。既定では、コストベースのオプティマイザーは、新しく作成された一時テーブルに〜1000行があると想定します。これにより、一時テーブルに実際に数百万行が含まれる場合、パフォーマンスが低下する可能性があります。

102
vladr

一時テーブルは、1つの保証のみを提供します。これらは、セッションの終了時に削除されます。小さなテーブルの場合、おそらくほとんどのデータがバッキングストアにあります。大きなテーブルの場合、データベースエンジンが他のリクエストのためにより多くの作業スペースを必要とするため、データがディスクに定期的にフラッシュされることを保証します。

編集:RAMのみの一時テーブルが絶対に必要な場合は、RAMディスク(/ dev/shmが機能します)にデータベース用のテーブルスペースを作成できます。これにより、ディスクIOですが、現在は物理ディスク書き込みなしでこれを行うことはできないことに注意してください;一時テーブルを作成すると、DBエンジンはテーブルリストを安定したストレージにフラッシュします。

15
Adam Hawes