はじめに
PostgreSQLを勉強するにあたって、構築や運用で必要そうな事を備忘録として残しました。
本記事は、各クエリごとに作成されるサーバプロセスのアクセス統計情報について確認します。
前提
PostgreSQL 13 を使用しています。
pg_stat_activityについて
pg_stat_activityビューは、サーバプロセス単位に「クエリの状態」や「プロセスの現在の活動」に関連した情報を表示します。問題の発生していクエリやプロセスを特定することが出来ます。
利用目的
- 問題のあるクエリの確認
- 長時間経過しているSQLの調査
- ロック待ち状態のSQLの調査
使い方
コマンド
SELECT * FROM pg_stat_activity;

図. pg_stat_activityビューの実行
主な表示項目
表. pg_stat_activityビューの主な項目
ビュー | 説明 |
---|---|
datid | データベースのOID |
datname | データベース名 |
pid | プロセスID |
leader_pid | パラレルグループリーダのプロセスID ※このプロセスがパラレルグループリーダーであるか、パラレルクエリに参加していないのであればNULL |
backend_start | プロセスの起動時間 |
xact_start | トランザクション開始時刻 |
query_start | クエリの発行時刻 |
wait_event_type | 処理待ちの状態 |
wait_event | 処理待ちの具体的な名称 |
state | プロセスの状態 1. active : 問い合わせ実行中 2. idle : トランザクション外でコマンド待ち 3. idle in transaction : トランザクション内でコマンド待ち 4. idle in transaction (aborted) : トランザクション内でエラー発生後、コマンド待ち 5. fastpath function call : 関数呼び出し中 6. disabled : track_activitiesがoff |
backend_xid | トランザクションID ※バックエンドの最上位のトランザクション識別子 |
backend_xmin | 現在のバックエンドのxmin |
query_id | クエリのID |
query | 最後に実行(実行中)のクエリ |
トランザクションの経過時間算出
xact_startはトランザクションの開始時刻となります。
このカラムと現在の時刻との差を算出し、どのくらいの時間が経過しているかを確認します。
コマンド
SELECT pid, state, (current_timestamp - xact_start)::interval(3) AS duration, query
FROM pg_stat_activity
WHERE pid <> pg_backend_pid();

図. トランザクションの経過時間算出
クエリの取り消し
pidによりプロセス番号を確認後、クエリの取り消しは、pg_cancel_backend関数を利用します。
コマンド
SELECT pg_cancel_backend('PID');

図. クエリの取り消し
セッションの切断
接続を強制的に切断する場合には、pg_terminate_backend関数を利用します。
コマンド
SELECT pg_terminate_backend('PID');

図. セッションの切断
参考文献
1. 勝俣 智成, 佐伯 昌樹, 原田 登志 (2018)「[改訂新版]内部構造から学ぶPostgreSQL 設計・運用計画の鉄則」技術評論社
2. 河原 翔 (2014)「LPI-Japan OSS-DB Gold 認定教材 PostgreSQL 高度技術者育成テキスト」エヌ・ティ・ティ・ソフトウェア株式会社
3. OSS-DB道場