86

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

このようなことを妥当な効率で行う唯一の方法は、TEMPORARY TABLEfor each query-postmaster python-thread を作成することのようです。TEMPORARY TABLEもちろん、作業メモリが不足していない限り、これらの s がハード ドライブに (まったく) 永続化されず、メモリ (RAM) に残ることを願っています。

TEMPORARY TABLE でディスクへの書き込みが発生するかどうかを知りたいです (これは INSERTS に干渉します。つまり、プロセス全体のダウンが遅くなります)。

4

2 に答える 2

125

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

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

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

考慮しなければならない考慮事項が複数あります。

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

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

于 2009-02-17T05:48:31.833 に答える
21

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

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

于 2009-01-28T06:19:04.597 に答える