PostgreSQLのpg_stat_statements拡張は、クエリの統計情報を集めるツールだよ。どんなクエリが一番多く実行されているか、どれが一番時間かかってるか、データベースのリソースがどれくらい効率的に使われてるかが見える。毎回EXPLAINで手動分析する代わりに、データベース全体のパフォーマンスをざっくり把握できるんだ。
pg_stat_statementsを使うメリット:
リアルタイムモニタリング:今まさにどのクエリがDBに負荷かけてるか見れる。
システム全体のパフォーマンス分析:手動で分析するクエリだけじゃなく、全部のクエリの情報が取れる。
遅いクエリの発見:どのクエリが一番時間かかってるかすぐ分かる。
繰り返し実行されるクエリの特定:キャッシュ最適化や人気クエリ用のインデックス追加に役立つ。
pg_stat_statementsのインストールと設定
じゃあ、pg_stat_statementsが何のためにあるか分かったところで、実際にインストールと設定をステップバイステップでやってみよう。
1. PostgreSQLの準備確認。 自分のPostgreSQLがpg_stat_statements拡張をサポートしてるか確認しよう。この拡張はPostgreSQL 9.2以降は標準で入ってる。拡張があるかどうかは、次のコマンドでチェック:
SELECT extname FROM pg_extension;
もしpg_stat_statementsがリストに無かったら、管理者がまだインストールしてないかも。
インストール&有効化されてると、こんな感じになるよ:
| extname |
|---|
| plpgsql |
| pg_stat_statements |
今はPostgreSQL 17.5を勉強してるから大丈夫だけど、もし仕事先に行ったら、必ずしも最新バージョンが使われてるとは限らないよ。10年くらい誰もアップデートしてないかもしれない。だって、プログラマーの鉄則は何?動いてるなら触るな。
2. 拡張機能の追加。
pg_stat_statementsを有効化するには、PostgreSQLのプリロードライブラリリストに追加する必要がある。これはpostgresql.conf設定ファイルでやるよ。
手順:
postgresql.confファイルを探す。普通はPostgreSQLのデータディレクトリにある。- エディタで開く。
- 次の行を追加または編集:
shared_preload_libraries = 'pg_stat_statements'
なんでこれが必要かというと、pg_stat_statementsはシステムレベルでクエリを追跡するから、事前にロードしないといけないんだ。
設定を保存して、PostgreSQLサーバーを再起動して変更を有効化。Linuxならこのコマンド:
sudo systemctl restart postgresql
ローカルで開発やテストしてるなら、普通にサーバー再起動すればOK。
3. データベースで拡張機能を作成。 PostgreSQLサーバーを再起動したら、特定のデータベースでpg_stat_statements拡張を作成できる。psqlや他のツールで対象DBに接続して、次を実行:
CREATE EXTENSION pg_stat_statements;
うまくいけばエラー無しで終わる。これでpg_stat_statementsが自分のDBで有効になったよ。
4. pg_stat_statementsのパラメータ設定。
拡張をインストールしたら、ちゃんと統計を集めるためにパラメータも設定しよう。主なパラメータはpostgresql.confで設定できる。
主なパラメータ
pg_stat_statements.track- どのクエリを追跡するか決める。
- 値:
all— 全部のクエリを追跡(デバッグや分析におすすめ)。top— トップレベルのクエリだけ追跡。none— 追跡しない。
- 設定例:
pg_stat_statements.track = 'all'
pg_stat_statements.max- 統計に保存するクエリの最大数を指定。
- デフォルト:5000。
- クエリが多いシステムなら、例えばこう増やす:
pg_stat_statements.max = 10000
pg_stat_statements.save- サーバー再起動時に統計を保存するかどうか。
- 値:
onまたはoff。 onのままにしておくのがおすすめ:pg_stat_statements.save = on
パラメータを変えたら、またPostgreSQLサーバーを再起動しよう。
pg_stat_statementsの動作確認
拡張がインストール&設定できたら、ちゃんと動いてるかチェックしよう。クエリ統計を確認するには、次のクエリを実行:
SELECT
queryid, -- クエリのユニークID
query, -- クエリのテキスト
calls, -- クエリの実行回数
total_time, -- 合計実行時間(ミリ秒)
rows -- クエリで返された行数
FROM pg_stat_statements
ORDER BY total_time DESC;
各カラムの意味は?
queryid: クエリのユニークID。同じクエリでパラメータ違いを探すのに便利。query: 実行されたSQLクエリのテキスト。calls: クエリが何回実行されたか。total_time: 全実行の合計時間。rows: クエリで返された行の合計数。
例えば、calls = 100でtotal_time = 50000(50秒)みたいなクエリがあったら、それがシステムの大半の時間を食ってるってことだから、最適化のサインだよ。
pg_stat_statementsの典型的な使い方
- 一番遅いクエリの発見。 どのクエリが一番時間かかってるか知りたいときは、
total_timeでソート:
SELECT query, total_time, calls
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 5;
- 一番アクティブなクエリの特定。 一番多く実行されてるクエリを探すには、
callsでソート:
SELECT query, calls, total_time
FROM pg_stat_statements
ORDER BY calls DESC
LIMIT 5;
- インデックス利用の分析。 遅いクエリが多い場合は、インデックスの利用をチェックしよう。例えば
WHERE付きクエリでインデックスが無いと、パフォーマンスが落ちる原因になりやすい。
pg_stat_statementsデータのリセット
たまに統計をリセットして、ゼロから分析したいこともあるよね。そんな時はこのコマンド:
SELECT pg_stat_statements_reset();
リセット後は統計が全部クリアされて、また新しくデータが集まり始めるよ。
実践的なアドバイス
統計の量はほどほどに:もし大量のクエリがあるシステムなら、pg_stat_statements.maxは無理に増やしすぎず、適度な値にしよう。無駄な負荷を避けるためだよ。
定期的に統計をリセット:パフォーマンス分析を始める前にリセットして、古いデータと混ざらないようにするのがオススメ。
遅いクエリには注意:たとえ実行頻度が低くても、1回の遅いクエリがDBに大きな負荷をかけることもある。
これでpg_stat_statements拡張のインストール、設定、使い方、クエリパフォーマンス分析のやり方が分かったね。次のレクチャーでは、これを使って遅いクエリを見つけて、どう最適化するかをもっと深く掘り下げるよ。
GO TO FULL VERSION