後輩「処理に9時間かかるんです」
僕「え?」
こんな会話から始まった話ですが、
Oracle→PostgreSQLの脱Oracle対応に関しては問題が多々あり
いわゆる「お作法」があります
そんな中で特にこれと思った内容を備忘録としてまとめようと思います。
インデックス
データをSELECT→UPDATEやINSERTをするような処理で
並び順が肝心となっている場合、SELECTしてカーソルなどにデータを投入する際に
並び順を指定してカーソルに投入します。
これは、PostgreSQLが一件ずつ処理していく都合によるのですが
このソート処理に関してインデックスをあらかじめ作成しておく
統計情報を作成しておく
などが大事になってきます。
特に大容量に検索になった場合、結合するテーブルに比例して
処理時間が膨大になっていくため
こういった検索の補助をしてあげることが大事になります。
基本的にはこの情報を作成してあげるだけで
ぐんと処理時間は短くなります。
バッファの不足
PostgreSQLのコネクション数やカーソルの数などによっては共有バッファが不足する場合があります
最大でアクセスされるタイミングなどからバッファの容量を裁定する作業も必要になります。
実行計画の見直し
パフォーマンス不振のネックとなっているポイントを探す必要があります。
EXPLAIN ANALYZE SELECT * FROM user WHERE last_login_date >= '2025-01-01' ;
などを用いて実行計画と実行時間を確認します。
終わりに
あくまでもPostgreSQLを使用する側面ですぐに対応が確認可能なものを挙げています
まずは大幅に処理時間を短縮し、
それでもパフォーマンス要求に満たない場合は
・SELECT系のカラムを明確に指定する
・サブクエリを結合に切り替えて明確に指定する
など基本的なSQLチューニングも必要になってきます