クエリを250万回実行する必要があります。このクエリは、AVG(column)
が必要な行を生成し、このAVG
を使用して、平均以下のすべての値からテーブルをフィルタリングします。次に、これらのフィルタリングされた結果をテーブルにINSERT
する必要があります。
合理的な効率でこのようなことを行う唯一の方法は、TEMPORARY TABLE
各query-postmaster python-threadに対して。これらのTEMPORARY TABLE
sはハードドライブに永続的に保存されず、もちろん作業メモリが不足している場合を除き、メモリ(RAM)に残ります。
TEMPORARY TABLEがディスク書き込みを引き起こすかどうかを知りたい(これはINSERTSに干渉する、つまりプロセス全体が遅くなる)
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行があると想定します。これにより、一時テーブルに実際に数百万行が含まれる場合、パフォーマンスが低下する可能性があります。
一時テーブルは、1つの保証のみを提供します。これらは、セッションの終了時に削除されます。小さなテーブルの場合、おそらくほとんどのデータがバッキングストアにあります。大きなテーブルの場合、データベースエンジンが他のリクエストのためにより多くの作業スペースを必要とするため、データがディスクに定期的にフラッシュされることを保証します。
編集:RAMのみの一時テーブルが絶対に必要な場合は、RAMディスク(/ dev/shmが機能します)にデータベース用のテーブルスペースを作成できます。これにより、ディスクIOですが、現在は物理ディスク書き込みなしでこれを行うことはできないことに注意してください;一時テーブルを作成すると、DBエンジンはテーブルリストを安定したストレージにフラッシュします。