プログラミング

【PostgreSQL高速化テクニックメモ】大量データロード対策

処理時間を計測する

\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モードでない場合)

-プログラミング
-,