環境構築からWEBアプリ開発・スマホアプリ開発まで。ときには動画制作やゲームも。

supilog
すぴろぐ

Amazon RDSのPostgreSQLバージョンアップ後に速度が出ない事象の解決方法(10.22→12.13)

Amazon RDSのPostgreSQLバージョンアップ後に速度が出ない事象の解決方法(10.22→12.13)

今回、とある知人より相談いただいた内容になります。

発生した事象の内容

「Amazon RDS for PostgreSQL」の対象バージョンのサポート切れにともない、バージョンアップが必要となった。そこでバージョンアップ作業(10.22→12.13)を行いアプリ確認してみたところ、今まで普通に検索できていたのに、あまりに重く検索が出来ない。という内容でした。

原因

結論から言いますと、「オプティマイザの統計情報が生成されていない為に、最適な実行計画が作成できずにパフォーマンスが劣化していた」という事象でした。

オプティマイザの統計情報?

統計情報とは、テーブルやインデックスなどのカラムの値の統計で、pg_statisticというシステムテーブルに保持されているようです。そして、この統計情報をもとに、結合順序や効率の良い実行プランを選んで実行する。それがオプティマイザの役割とのこと。

故に、統計情報が失われた事で、パフォーマンスが著しく低下していたようです。

なぜ統計情報は失われたの?

Optimizer の統計情報はメジャーバージョンのアップグレード中には転送されないため、パフォーマンスの問題を回避するためにすべての統計情報を再生成する必要があります。次のようにパラメータを指定せずにコマンドを実行して、現在のデータベース内のすべての標準テーブルの統計情報を生成します。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.PostgreSQL.html

明記されてました。正常な動作のようです。ということで、対応に行きましょう。

対応内容

ANALYZEコマンドを実行して、統計情報を再生成する

ANALYZE VERBOSE

VERBOSEはオプションで、進行状況を表示できる。なくても動作します。

これで、対象DB全体の統計情報が再生成されるので、データ量やインデックス状況によっては長時間かかります。(今回の相談の場合は、およそ90分ほどかかりました)

これで元どおりのパフォーマンスに戻りました。

参考資料

Amazon RDS の PostgreSQL DB エンジンのアップグレード

Amazon RDS for PostgreSQL および Aurora for PostgreSQL のメジャーバージョンアップグレードに関する問題をトラブルシューティングするにはどうすればよいですか?

PostgreSQL Internals

RDS for PostgreSQL メジャーバージョンアップグレード後に CPU 使用率が高くなる事象の対処方法

AWS RDS PostgreSQL 9.6から13.3にアップグレードしたときにハマったことまとめ