[アップデート] Amazon CloudWatch Database Insights で Aurora PostgreSQL のクエリ実行計画を確認できるようになりました
いわさです。
Amazon RDS には Performance Insight というデータベース負荷を分析する機能があります。
ここ最近の機能強化でデータベースエンジンが Oracle、SQL Server の場合は実行計画を Performance Insights 上で確認することが出来るようになっています。
他の MySQL や PostgreSQL でも確認出来ると便利なのだがと思っていたのですが、今朝のアップデートで Aurora PostgreSQL で類似の機能が提供されるようになったようです。
昨年の re:Invent 2024 にて Performance Insigths は拡張されて CloudWatch Database Insights というものと統合されました。
従来の Performance Insights に加えてデータベースの様々なインサイトを得ることが出来る分析機能です。
今回のアップデートではこの CloudWatch Database Insights 上で実行計画が確認できるようになったというもの。
試してみましょう。
データベースを構築
まずは Aurora PostgreSQL データベースの構築を行いましょう。
以下が本アップデートに関する公式ドキュメントです。
まずデータベースエンジンバージョンですが、ドキュメントによると「Aurora PostgreSQL バージョン 14.10、15.5、およびそれ以降のすべてのバージョンを使用する必要がある」とのこと。
今回は最新の 16.6 を選択します。
そして非常に重要な前提条件がありまして、CloudWatch Database Insights のアドバンスドプランである必要があります。
CloudWatch Database Insight は機能や料金の異なるスタンダードプランとアドバンスドプランがあります。今回の機能は後者でのみ利用が可能です。
加えて、今回の機能を使うためにはクラスターパラメータグループ内のaurora_compute_plan_id
をon(1)
に設定する必要があります。このパラメータはデフォルトはoff(0)
なので明示的に指定が必要だという点を覚えておきましょう。
負荷をかけておく
ここは本アップデートとはあまり関係ないですが、今回は pgbench[1] を使ってテーブルの作成とベンチマークの実行を行いました。
まずテーブルの初期化です。データベース自体はクラスター作成時に指定して作成済みです。
% pgbench -i -h hoge0123aurora.cluster-cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com -U postgres hogedb
Password:
dropping old tables...
NOTICE: table "pgbench_accounts" does not exist, skipping
NOTICE: table "pgbench_branches" does not exist, skipping
NOTICE: table "pgbench_history" does not exist, skipping
NOTICE: table "pgbench_tellers" does not exist, skipping
creating tables...
generating data (client-side)...
100000 of 100000 tuples (100%) done (elapsed 0.16 s, remaining 0.00 s)
vacuuming...
creating primary keys...
done in 1.18 s (drop tables 0.05 s, create tables 0.13 s, client-side generate 0.69 s, vacuum 0.18 s, primary keys 0.14 s).
続いてベンチマークを実行します。
% pgbench -c 10 -t 1000 -h hoge0123aurora.cluster-cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com -U postgres -d hogedb
pgbench: client 9 executing script "<builtin: TPC-B (sort of)>"
pgbench: client 9 executing \set aid
pgbench: client 9 executing \set bid
pgbench: client 9 executing \set tid
pgbench: client 9 executing \set delta
pgbench: client 9 sending BEGIN;
pgbench: client 9 receiving
pgbench: client 0 receiving
pgbench: client 0 sending INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (2, 1, 96103, 2487, CURRENT_TIMESTAMP);
pgbench: client 0 receiving
pgbench: client 2 receiving
pgbench: client 2 sending UPDATE pgbench_tellers SET tbalance = tbalance + 4675 WHERE tid = 7;
pgbench: client 2 receiving
pgbench: client 9 receiving
pgbench: client 9 sending UPDATE pgbench_accounts SET abalance = abalance + -1570 WHERE aid = 36286;
pgbench: client 9 receiving
pgbench: client 0 receiving
pgbench: client 0 sending END;
pgbench: client 0 receiving
pgbench: client 2 receiving
pgbench: client 2 sending UPDATE pgbench_branches SET bbalance = bbalance + 4675 WHERE bid = 1;
pgbench: client 2 receiving
pgbench: client 9 receiving
:
少し待つと Perforamance Insights や CloudWatch Database Insights 上のダッシュボードに変化が出てくるはずです。
実行計画を確認してみる
CloudWatch Database Insights のダッシュボードにアクセスしてみると Top SQL で従来 SQL テキストが確認できていたパネル内に「プラン」というタブが存在していることに気が付きました。これかな。
適当なクエリを選択してみると、出てきました。
適当にベンチマークかけただけなので実行計画本体に対して言及しませんが、アップデート時にシーケンシャルスキャンが使われていることなどが確認できます。このあたりをチェックしたり、あるいはこの画面ではダイジェストクエリ同士を比較することが出来るので実行計画の改善や変化を確認することが出来そうです。
なお、本機能は CloudWatch Database Insights の機能という位置づけのためか、Performance Insights 上では確認することが出来ませんでした。プランのタブが存在していません。
さいごに
本日は Amazon CloudWatch Database Insights で Aurora PostgreSQL のクエリ実行計画を確認できるようになったので使ってみました。
CloudWatch Database Insights のアドバンスドプランが必要という点が前提条件としてちょっと大きい感じですね。
比較とか出来ますし、インサイトダッシュボードに集約できるので使いやすいと思いますが。
コストが気になる方は以下の記事のように PostgreSQL 内部で独自に実行計画を取得するのが良いかなという感じでしょうか。