CodeGym /コース /SQL SELF /pg_stat_statements入門:拡張機能のインストールと設定

pg_stat_statements入門:拡張機能のインストールと設定

SQL SELF
レベル 42 , レッスン 1
使用可能

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設定ファイルでやるよ。

手順:

  1. postgresql.confファイルを探す。普通はPostgreSQLのデータディレクトリにある。
  2. エディタで開く。
  3. 次の行を追加または編集:
   shared_preload_libraries = 'pg_stat_statements'

なんでこれが必要かというと、pg_stat_statementsはシステムレベルでクエリを追跡するから、事前にロードしないといけないんだ。

  1. 設定を保存して、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 = 100total_time = 50000(50秒)みたいなクエリがあったら、それがシステムの大半の時間を食ってるってことだから、最適化のサインだよ。

pg_stat_statementsの典型的な使い方

  1. 一番遅いクエリの発見。 どのクエリが一番時間かかってるか知りたいときは、total_timeでソート:
SELECT query, total_time, calls
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 5;
  1. 一番アクティブなクエリの特定。 一番多く実行されてるクエリを探すには、callsでソート:
SELECT query, calls, total_time
FROM pg_stat_statements
ORDER BY calls DESC
LIMIT 5;
  1. インデックス利用の分析。 遅いクエリが多い場合は、インデックスの利用をチェックしよう。例えばWHERE付きクエリでインデックスが無いと、パフォーマンスが落ちる原因になりやすい。

pg_stat_statementsデータのリセット

たまに統計をリセットして、ゼロから分析したいこともあるよね。そんな時はこのコマンド:

SELECT pg_stat_statements_reset();

リセット後は統計が全部クリアされて、また新しくデータが集まり始めるよ。

実践的なアドバイス

統計の量はほどほどに:もし大量のクエリがあるシステムなら、pg_stat_statements.maxは無理に増やしすぎず、適度な値にしよう。無駄な負荷を避けるためだよ。

定期的に統計をリセット:パフォーマンス分析を始める前にリセットして、古いデータと混ざらないようにするのがオススメ。

遅いクエリには注意:たとえ実行頻度が低くても、1回の遅いクエリがDBに大きな負荷をかけることもある。

これでpg_stat_statements拡張のインストール、設定、使い方、クエリパフォーマンス分析のやり方が分かったね。次のレクチャーでは、これを使って遅いクエリを見つけて、どう最適化するかをもっと深く掘り下げるよ。

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION