処理時間を計測する
\timing on
UNLOGGED TABLEを利用する
中間テーブルとしてテーブルを作成する際には UNLOGGED TABLEを利用すること。
UNLOGGED
指定された場合、テーブルはログを取らないテーブルとして作成されます。 ログを取らないテーブルに書き出されたデータは先行書き込みログ(第30章参照)には書き出されません。 このため通常のテーブルより相当高速になります。 しかしこれらはクラッシュ時に安全ではありません。 クラッシュまたは異常停止の後、ログを取らないテーブルは自動的に切り詰められます。 またログを取らないテーブルの内容はスタンバイサーバに複製されません。 ログを取らないテーブル上に作成されたインデックスはすべて同様に、ログを取らないようになります。
https://www.postgresql.jp/document/11/html/sql-createtable.html
不要なインデックスの削除
インデックスは検索能力を向上させる一方データ挿入のコストが増大します。
pg_stat_user_indexes でインデックスが使われているかどうか見ることができます。あまり使われていないインデックスは削除しましょう。
SELECT * FROM pg_stat_user_indexes WHERE relname = 'mytable';
-[ RECORD 1 ]-+----------------------
relid | 999999
indexrelid | 999999
schemaname | public
relname | mytable
indexrelname | mytable_rec_pkey
idx_scan | 0
idx_tup_read | 0
idx_tup_fetch | 0
【重要】ANALYZE
大量データのロード、または大幅なデータの変更があった直後にデータに問い合わせる場合、ANALYZEかVACUUM ANALYZEを手動実行するようにしましょう。
統計情報と実際のテーブル情報がかけ離れてしまい、適切な実行計画が作成されないためです。
※手動ANALYZEの後はCOMMITが必要です。忘れないようにしておきましょう。(autocommitモードでない場合)