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
のオプション - 一時テーブルを頻繁に使用するときに気にする必要があることは他にありますか?カタログからデッドタプルをクリーンアップするために、一時テーブルを削除した後はバキュームを使用することをお勧めします。デフォルト設定(
auto_vacuum
)を使用すると、Postgresは約3分ごとに自動的にバキュームします。 。
また、質問とは関係ありません(ただし、プロジェクトに関係している可能性があります)。後に一時テーブルに対してクエリを実行する必要がある場合は、注意してください。 値を入力したら、適切なインデックスを作成してANALYZE
を発行することをお勧めします。 問題の一時テーブルで後 挿入が完了しました。デフォルトでは、コストベースのオプティマイザは、新しく作成された一時テーブルに最大1000行があると想定します。これにより、一時テーブルに実際に数百万行が含まれている場合、パフォーマンスが低下する可能性があります。