1. ホーム
  2. performance

[解決済み] PostgreSQLのテンポラリテーブル

2023-05-25 10:19:10

質問

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

このようなことを合理的な効率で行う唯一の方法は、テーブルを作成することです。 TEMPORARY TABLE を作成することです。私は、これらの TEMPORARY TABLE がハードドライブに(まったく)保存されず、メモリ(RAM)に残ることを望んでいます。

TEMPORARY TABLE がディスク書き込みを発生させるかどうかを知りたいです (これは INSERTS を妨害し、つまりプロセス全体を遅くします)。

どのように解決するのですか?

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
  • 一時テーブルを頻繁に使用する場合、他に何か心配することはありますか? 一時テーブルをDROPした後は、カタログから死んだタプルを一掃するためにバキュームすることをお勧めします。デフォルトの設定を使用すると、Postgresは自動的に3分ごとにバキュームを行います ( auto_vacuum ).

また、あなたの質問とは関係ありませんが(しかしおそらくあなたのプロジェクトに関連しています)、テンポラリテーブルに対してクエリを実行する必要がある場合、次のことを心に留めておいてください。 の後に に対してクエリを実行する必要がある場合、適切なインデックスを作成し、そのインデックスに対して ANALYZE を発行するのが良いでしょう。 に挿入されます。 デフォルトでは、コストベースのオプティマイザーは、新しく作成された一時テーブルの行数が ~1000 行であると仮定します。