27.2. 統計情報コレクタ

PostgreSQL統計情報コレクタはサーバの活動状況に関する情報を収集し、報告するサブシステムです。 現在、コレクタはテーブルとインデックスへのアクセスをディスクブロックおよび個々の行単位で数えることができます。 またこれは、各テーブル内の総行数、および、各テーブルでのVACUUMやANALYZEの実施情報を追跡します。 また、ユーザ定義関数の呼ばれた回数、それぞれの消費した総時間をカウントします。

また、PostgreSQLは他のサーバプロセスによって現在実行されている問い合わせを正確に報告する機能を持ちます。 これはコレクタプロセスから独立している機能です。

27.2.1. 統計情報収集のための設定

統計情報の収集によって問い合わせの実行に少しオーバーヘッドが加わりますので、システムは情報を収集するようにもしないようにも設定することができます。 これは通常はpostgresql.conf内で設定される、設定パラメータによって制御されます (設定パラメータの設定についての詳細は第18章を参照してください)。

track_activitiesパラメータにより、すべてのサーバプロセスで現在実行されているコマンドを監視することができます。

track_countsパラメータは、テーブルおよびインデックスアクセスに関する統計情報を収集するかどうか制御します。

track_functionsパラメータにより、ユーザ定義関数の使用状況を追跡するかどうかを指定できます。

track_io_timingパラメータにより、ブロックの読み込みと書き込み時間を監視することができます。

通常、これらの変数は全てのサーバプロセスに適用できるようにpostgresql.conf内で設定されます。 しかし、SETコマンドを使用して、個別のセッションで有効または無効にすることができます (一般ユーザがその活動を管理者に隠すことを防止するために、スーパーユーザのみがSETを使用してこれらのパラメータを変更することができます。)

統計情報コレクタは他のPostgreSQLプロセスの情報を収集し、一時ファイルへ送信します。 これらのファイルはstats_temp_directoryパラメータで指定されたディレクトリに格納されます。デフォルトはpg_stat_tmpです。 性能向上のため、stats_temp_directoryをRAMベースのファイルシステム上に指定することで、物理I/Oの要求を減らすことができます。 サーバがシャットダウンした際は、統計情報データの永続的なコピーがglobalサブディレクトリに格納されるため、サーバの再起動をまたがって統計情報データを保持することができます。

27.2.2. 収集した統計情報の表示

統計情報の収集結果を表示するための、多くの定義済みのビューがあり、表27-1に一覧表示されています。 他にも、項27.2.3で説明されているように、基礎的な統計情報関数を使用した独自のビューを構築することもできます。

この統計情報を使用して、現在の活動状況を監視する場合、この情報は即座に更新されないことを認識することが重要です。 個別のサーバプロセスは、待機状態になる直前に、新しい統計情報に関する数をコレクタに送信します。 ですので、実行中の問い合わせやトランザクションは表示上の総和には影響を与えません。 また、コレクタ自体もおよそPGSTAT_STAT_INTERVAL(サーバ構築時に変更しない限り500)ミリ秒に一度新しい報告を出力します。 ですので、表示上の情報は実際の活動から遅れて表示されます。 しかし、track_activitiesで収集される現在の問い合わせの情報は常に最新です。

この他の重要なポイントは、いつサーバプロセスが統計情報を表示するように尋ねられるかです。 サーバプロセスは、まずコレクタによって発行された最も最近の報告を取り出します。 そして、現在のトランザクションが終わるまで、全ての統計情報ビューと関数においてこのスナップショットを使用し続けます。 ですから、現在のトランザクションを続けている間、統計情報は一定の情報を示します。 同様に、全セッションの現在の問い合わせに関する情報も、そうした情報がトランザクションで最初に要求された時に収集され、そのトランザクションの間同じ情報が表示されます。 これはバグではなく、特徴です。 なぜなら、これにより、知らない間に値が変更することを考慮することなく、統計情報に対して複数の問い合わせを実行し、その結果を相関することができるからです。 しかし、各問い合わせで新しい結果を取り出したい場合は、確実にトランザクションブロックの外側でその問い合わせを行ってください。 他にもpg_stat_clear_snapshot()を呼び出すこともできます。 これは現在のトランザクションの統計情報スナップショットを(もしあれば)破棄します。 次に統計情報を使用する場合に新しいスナップショットを取り出すことになります。

トランザクションからは、pg_stat_xact_all_tablespg_stat_xact_sys_tablespg_stat_xact_user_tablespg_stat_xact_user_functionsビューを通じて、自身の統計情報(まだコレクタに送られていない)も参照することができます。 これらの数値はトランザクション中に継続的に更新されていくため上記の様な(静的な情報を示す)振る舞いとはなりません。

表 27-1. 標準統計情報ビュー

ビュー名説明
pg_stat_activity サーバプロセスあたり1行の形で、状態や現在のクエリ情報など、プロセスの現在の活動に関連した情報を表示します。詳細はpg_stat_activityを参照してください。
pg_stat_bgwriter バックグラウンドライタプロセスの稼動統計情報を1行の形で表示します。詳細はpg_stat_bgwriterを参照してください。
pg_stat_database データベースあたり1行の形で、データベース全体の稼動統計情報を示します。詳細はpg_stat_databaseを参照してください。
pg_stat_all_tables 現在のデータベース内の各テーブルあたり1行の形で、指定されたテーブルへのアクセス統計情報を示します。詳細はpg_stat_all_tablesを参照してください。
pg_stat_sys_tablesシステムテーブルのみが表示される点を除き、pg_stat_all_tablesと同じです。
pg_stat_user_tablesユーザテーブルのみが表示される点を除き、pg_stat_all_tablesと同じです。
pg_stat_xact_all_tablespg_stat_all_tablesと似ていますが、現在のトランザクションにて実施された処理結果をカウントします。(数値が見える時点では、これらの数値はpg_stat_all_tablesと関連するビューに含まれていません。) このビューでは、有効行数、無効行数、およびバキュームやアナライズの活動は表示しません。
pg_stat_xact_sys_tables システムテーブルのみが表示される点を除き、pg_stat_xact_all_tablesと同じです。
pg_stat_xact_user_tables ユーザテーブルのみが表示される点を除き、pg_stat_xact_all_tablesと同じです。
pg_stat_all_indexes 現在のデータベース内の各インデックスあたり1行の形で、指定されたインデックスへのアクセス統計情報を示します。詳細はpg_stat_all_indexesを参照してください。
pg_stat_sys_indexesシステムテーブルのインデックスのみが表示される点を除き、pg_stat_all_indexesと同じです。
pg_stat_user_indexesユーザテーブルのインデックスのみが表示される点を除き、pg_stat_all_indexesと同じです。
pg_statio_all_tables 現在のデータベース内の各テーブルあたり1行の形で、指定されたテーブルのI/O統計情報を示します。詳細はpg_statio_all_tablesを参照してください。
pg_statio_sys_tablesシステムテーブルのみが表示される点を除き、pg_statio_all_tablesと同じです。
pg_statio_user_tablesユーザテーブルのみが表示される点を除き、pg_statio_all_tablesと同じです。
pg_statio_all_indexes 現在のデータベース内の各インデックスあたり1行の形で、指定されたインデックスのI/O統計情報を示します。詳細はpg_statio_all_indexesを参照してください。
pg_statio_sys_indexesシステムテーブルのインデックスのみが表示される点を除き、pg_statio_all_indexes と同じです。
pg_statio_user_indexesユーザテーブルのインデックスのみが表示される点を除き、pg_statio_all_indexesと同じです。
pg_statio_all_sequences 現在のデータベース内の各シーケンスあたり1行の形で、指定されたシーケンスのI/O統計情報を示します。詳細はpg_statio_all_sequencesを参照してください。
pg_statio_sys_sequencesシステムシーケンスのみが表示される点を除き、pg_statio_all_sequencesと同じです (現時点では、システムシーケンスは定義されていませんので、このビューは常に空です)。
pg_statio_user_sequencesユーザシーケンスのみが表示される点を除き、pg_statio_all_sequencesと同じです。
pg_stat_user_functions 追跡された各関数あたり1行の形で、関数の実行統計情報を示します。詳細はpg_stat_user_functionsを参照してください。
pg_stat_xact_user_functions pg_stat_user_functionsと似ていますが、現在のトランザクション中に呼び出されたものだけをカウントします。 (数値が見える時点では、これらの数値はpg_stat_user_functionsに含まれていません。)
pg_stat_replication WAL送信プロセスあたり1行の形で、スタンバイサーバに接続している送信プロセスのレプリケーション統計情報を示します。詳細はpg_stat_replicationを参照してください。
pg_stat_database_conflicts データベースあたり1行の形で、スタンバイサーバのデータベース全体での、リカバリ処理時の衝突を起因とする問い合わせキャンセルの統計情報を示します。詳細はpg_stat_database_conflictsを参照してください。

インデックス単位の統計情報は、どのインデックスが使用され、どの程度効果があるのかを評価する際に、特に有用です。

pg_statio_ビューは主に、バッファキャッシュの効率を評価する際に有用です。 実ディスク読み取りの数がバッファヒットの数よりもかなり少ないのであれば、そのキャッシュはカーネル呼び出しを行うことなく、ほとんどの読み取り要求を満足させています。 しかし、PostgreSQLバッファキャッシュに存在しないデータはカーネルのI/Oキャッシュにある可能性があり、そのため、物理的な読み取りを行うことなく取り出される可能性があるというPostgreSQLのディスクI/Oの取り扱いのため、これらの統計情報は、完全な論拠を提供しません。 PostgreSQLのI/O動作に関するより詳細な情報を入手したいのであれば、PostgreSQL統計情報コレクタとカーネルのI/Oの取り扱いの監視を行うオペレーティングシステムユーティリティを組み合わせることを勧めます。

表 27-2. pg_stat_activityビュー

説明
datidoidこのバックエンドが接続しているデータベースのOID
datnamenameこのバックエンドが接続しているデータベース名
pidintegerこのバックエンドのプロセスID
usesysidoidこのバックエンドにログインしているユーザのOID
usenamenameこのバックエンドにログインしているユーザの名前
application_nametextこのバックエンドに接続しているアプリケーションの名前
client_addrinet このバックエンドに接続しているクライントのIPアドレス。もしこの列がNULLならば、クライアントはサーバマシンのUNIXソケット経由での接続か、autovacuumの様な内部プロセスであることを示します。
client_hostnametext client_addrのDNS逆引きにより通知される、接続しているクライアントのホスト名。この列はlog_hostnameが有効であり、またIP接続をしている時のみ非NULLとなります。
client_portinteger クライアントがこのバックエンドと通信を行う際に使用しているTCPポート番号。UNIXソケットが使用されている場合は-1となります。
backend_starttimestamp with time zone プロセスが開始された時間。例えば、クライアントがサーバに接続した時などです。
xact_starttimestamp with time zone プロセスの現在のトランザクションが開始された時間。NULLの場合は現在実施されているトランザクションはありません。もし、現在のクエリがそのトランザクションの最初のクエリだった場合、この列はquery_startと等しくなります。
query_starttimestamp with time zone 現在実施されている問い合わせが開始された時間。ただし、stateactiveではない場合、直近に実施された問い合わせの開始時間となります。
state_changetimestamp with time zonestateが最後に変更された時間。
waitingboolean現在ロック待ちだった場合は真となります。
statetext このバックエンドの現在の状態。取りえる値は以下です。

  • active: バックエンドは問い合わせを実行中

  • idle: バックエンドは新しいクライアントからの命令の待機中

  • idle in transaction: バックエンドはトランザクション中であるが、現在実行中の問い合わせは無い

  • idle in transaction (aborted): このトランザクション中のある問い合わせ文でエラーが発生したことを除き、idle in transactionと同じ

  • fastpath function call: バックエンドはfast-path関数を実行中

  • disabled: このバックエンドではtrack_activitiesが無効にされている

querytext このバックエンドで最も直近の問い合わせ文字列。もしstateactiveであれば、現在実行中の問い合わせを表示します。それ以外の場合は、最後に実施された問い合わせを表示します。

pg_stat_activityはサーバプロセスあたり1行を持ち、そのプロセスの現在の活動に関連した情報を示します。

注意: waitingstateの列は独立しています。もしバックエンドがactiveの状態でも、waitingの状態であるかもしれませんし、そうでないかもしれません。 もしactivewaitingがともに真である状態ならば、問い合わせが実行中ですが、システムのどこかでロック待ちの状態にあることを意味します。

表 27-3. pg_stat_bgwriterビュー

説明
checkpoints_timedbigint実施された定期的チェックポイント回数
checkpoints_reqbigint実施された要求チェックポイント回数
checkpoint_write_timedouble precision チェックポイント処理における、ファイルのディスクへの書き込み処理に費やされた総合の累積時間。単位はミリ秒。
checkpoint_sync_timedouble precision チェックポイント処理における、ファイルのディスクへの同期処理に費やされた総合の累積時間。単位はミリ秒。
buffers_checkpointbigintチェックポイント処理で書き込まれたバッファの数
buffers_cleanbigintバックグラウンドライタにより書き込まれたバッファの数
maxwritten_cleanbigint あまりに多くのバッファを書き出したため、バックグランドライタが整理用スキャンを中断した回数
buffers_backendbigintバックエンドにより直接書き出されたバッファの数
buffers_backend_fsyncbigint バックエンドが自身でfsyncを実施した回数(通常、バックエンド自身が書き込む場合でもバックグラウンドライタがそれらを制御します)
buffers_allocbigint割り当てられたバッファの数
stats_resettimestamp with time zone最後にこれらの統計情報がリセットされた時間

pg_stat_bgwriterビューは、クラスタ全体のグローバルなデータを含む一つの行を常に保持します。

表 27-4. pg_stat_databaseビュー

説明
datidoidデータベースのOID
datnamenameデータベース名
numbackendsinteger 現在このデータベースに接続しているバックエンドの数。このビューの中で、現在の状態を反映した値を返すのはこの列だけです。他の列は、最後にリセットされた時からの累積値を返します。
xact_commitbigint このデータベースでコミットされたトランザクション数
xact_rollbackbigint このデータベースでロールバックされたトランザクション数
blks_readbigintこのデータベースで読み込まれたディスクブロック数
blks_hitbigint ディスクブロックがバッファキャッシュ上でヒットし、ディスク読み込みが不要だった回数(これはPostgreSQLのバッファキャッシュ上でヒットしたものだけを含んでおり、オペレーティングシステムのファイルキャッシュは含んでいません)
tup_returnedbigintこのデータベースでの問い合わせにより返された行数
tup_fetchedbigintこのデータベースでの問い合わせによりフェッチされた行数
tup_insertedbigintこのデータベースで挿入された行数
tup_updatedbigintこのデータベースで更新された行数
tup_deletedbigintこのデータベースで削除された行数
conflictsbigint このデータベースでリカバリ処理と競合した結果キャンセルされた問い合わせ数(競合はスタンバイサーバ上でのみ発生します。詳しくはpg_stat_database_conflictsを参照してください)
temp_filesbigint このデータベースで問い合わせにより作成された一時ファイルの数。一時ファイルの生成理由(例えばソートなのかハッシュのためなのか)やlog_temp_files設定は考慮されず、生成された全ての一時ファイルがカウントされます。
temp_bytesbigint このデータベースで問い合わせにより作成された一時ファイルの累積サイズ。一時ファイルの生成理由やlog_temp_files設定は考慮されず、生成された全ての一時ファイルサイズが集計されます。
deadlocksbigintこのデータベースで検知されたデッドロック回数
blk_read_timedouble precision このデータベースでバックエンドによりデータファイルブロックの読み込みに費やされた時間。単位はミリ秒。
blk_write_timedouble precision このデータベースでバックエンドによりデータファイルブロックの書き込みに費やされた時間。単位はミリ秒。
stats_resettimestamp with time zoneこれらの統計情報が最後にリセットされた時間

pg_stat_databaseビューはクラスタに存在するデータベースごとに1行を持ち、データベース全体の統計情報を示します。

表 27-5. pg_stat_all_tablesビュー

説明
relidoidテーブルのOID
schemanamenameこのテーブルが属しているスキーマの名前
relnamenameこのテーブルの名前
seq_scanbigintこのテーブルで実施されたシーケンシャルスキャンの回数
seq_tup_readbigintシーケンシャルスキャンによって取得された有効行数
idx_scanbigintこのテーブルで実施されたインデックススキャンの回数
idx_tup_fetchbigintインデックススキャンによって取得された有効行数
n_tup_insbigint挿入された行数
n_tup_updbigint更新された行数
n_tup_delbigint削除された行数
n_tup_hot_updbigint HOT更新(例えばインデックスの更新を伴わないもの)された行数
n_live_tupbigint有効行の見積もり数
n_dead_tupbigint無効行の見積もり数
last_vacuumtimestamp with time zone このテーブルへ最後に実施した手動VACUUMの時間(VACUUM FULLはカウントしません)
last_autovacuumtimestamp with time zone このテーブルへ最後に実施した自動VACUUMの時間
last_analyzetimestamp with time zoneこのテーブルへ最後に実施した手動ANALYZEの時間
last_autoanalyzetimestamp with time zone このテーブルへ最後に実施した自動ANALYZEの時間
vacuum_countbigint このテーブルへ実施した手動VACUUMの回数(VACUUM FULLはカウントしません)
autovacuum_countbigint このテーブルへ実施した自動VACUUMの回数
analyze_countbigintこのテーブルへ実施した手動ANALYZEの回数
autoanalyze_countbigint このテーブルへ実施した自動ANALYZEの回数

pg_stat_all_tablesビューは、現在のデータベースにある(TOASTテーブルを含む)テーブル毎に1行を持ち、指定したテーブルへのアクセス統計情報を示します。 pg_stat_user_tablespg_stat_sys_tablesも同じ情報を含みますが、それぞれユーザテーブルとシステムテーブルの情報のみを示すようフィルタされます。

表 27-6. pg_stat_all_indexesビュー

説明
relidoidこのインデックスを付与しているテーブルのOID
indexrelidoidこのインデックスのOID
schemanamenameこのインデックスが属しているスキーマの名前
relnamenameこのインデックスを付与しているテーブルの名前
indexrelnamenameこのインデックスの名前
idx_scanbigintこのインデックスを使って実施されたインデックススキャンの回数
idx_tup_readbigintこのインデックスへのスキャンにより返されたインデックスエントリ数
idx_tup_fetchbigint このインデックスを用いた単純なインデックススキャンにより取得された有効なテーブルの行数

pg_stat_all_indexesビューは、現在のデータベースにあるインデックス毎に1行を持ち、指定したインデックスへのアクセス統計情報を示します。 pg_stat_user_indexespg_stat_sys_indexesも同じ情報を含みますが、それぞれユーザインデックスとシステムインデックスの情報のみを示すようフィルタされます。

インデックスは単純なスキャン、または"ビットマップ"インデックススキャン経由で使用することができます。 ビットマップスキャンでは、複数のインデックスの出力をANDまたはOR規則を使って組み合わせることができます。 そのため、ビットマップスキャンが使用されると、個々のヒープ行の取り出しと特定のインデックスとを関連付けることは困難です。 したがって、ビットマップスキャンは使用したインデックスに関するpg_stat_all_indexes.idx_tup_readの数を増やします。 さらに、そのテーブルに関するpg_stat_all_tables.idx_tup_fetchの数も増やします。 しかし、pg_stat_all_indexes.idx_tup_fetchを変更しません。

注意: idx_tup_readはインデックスから取り出したインデックス項目数を数え、一方でidx_tup_fetchはテーブルから取り出した有効な行数を数えるため、 ビットマップスキャンを使用しなくとも、idx_tup_readidx_tup_fetchの2つの値が異なることはあります。 インデックスを使用して取り出した行に無効または未コミットの行があったり、あるいはインデックスオンリースキャンによりヒープからのフェッチが避けられた場合などは、後者は少なくなります。

表 27-7. pg_statio_all_tablesビュー

説明
relidoidテーブルのOID
schemanamenameこのテーブルが属しているスキーマの名前
relnamenameこのテーブルの名前
heap_blks_readbigintこのテーブルから読み取られたディスクブロック数
heap_blks_hitbigintこのテーブルのバッファヒット数
idx_blks_readbigintこのテーブルに付与されている全てのインデックスから読み取られたディスクブロック数
idx_blks_hitbigintこのテーブルに付与されている全てのインデックスのバッファヒット数
toast_blks_readbigintこのテーブルの(もしあれば)TOASTテーブルから読み取られたディスクブロック数
toast_blks_hitbigintこのテーブルの(もしあれば)TOASTテーブルのバッファヒット数
tidx_blks_readbigintこのテーブルの(もしあれば)TOASTテーブルインデックスから読み取られたディスクブロック数
tidx_blks_hitbigintこのテーブルの(もしあれば)TOASTテーブルインデックスのバッファヒット数

pg_statio_all_tablesビューは、現在のデータベースにある(TOASTテーブルを含む)テーブル毎に1行を持ち、指定したテーブルのI/O統計情報を示します。 pg_statio_user_tablespg_statio_sys_tablesも同じ情報を含みますが、それぞれユーザテーブルとシステムテーブルの情報のみを示すようフィルタされます。

表 27-8. pg_statio_all_indexesビュー

説明
relidoidこのインデックスが付与されているテーブルのOID
indexrelidoidこのインデックスのOID
schemanamenameこのインデックスが属しているスキーマの名前
relnamenameこのインデックスが付与されているテーブルの名前
indexrelnamenameこのインデックスの名前
idx_blks_readbigintこのインデックスから読み取られたディスクブロック数
idx_blks_hitbigintこのインデックスのバッファヒット数

pg_statio_all_indexesビューは、現在のデータベースにあるインデックス毎に1行を持ち、指定したインデックスのI/O統計情報を示します。 pg_statio_user_indexespg_statio_sys_indexesも同じ情報を含みますが、それぞれユーザインデックスとシステムインデックスの情報のみを示すようフィルタされます。

表 27-9. pg_statio_all_sequencesビュー

説明
relidoidシーケンスのOID
schemanamenameこのシーケンスが属しているスキーマの名前
relnamenameこのシーケンスの名前
blks_readbigintこのシーケンスから読み取られたディスクブロック数
blks_hitbigintこのシーケンスのバッファヒット数

pg_statio_all_sequencesビューは、現在のデータベースにあるシーケンス毎に1行を持ち、指定したシーケンスのI/O統計情報を示します。

表 27-10. pg_stat_user_functionsビュー

説明
funcidoid関数のOID
schemanamenameこの関数が属しているスキーマの名前
funcnamenameこの関数の名前
callsbigintこの関数が呼ばれた回数
total_timedouble precisionこの関数と、この関数から呼ばれた他の関数の総処理時間。単位はミリ秒
self_timedouble precisionこの関数から呼ばれた他の関数は含まない、この関数自身のみの総処理時間。単位はミリ秒

pg_stat_user_functionsビューは、追跡された関数毎に1行を持ち、これら関数の実行統計情報を示します。 track_functionsパラメータにより、どの関数を正確に追跡するかを制御できます。

表 27-11. pg_stat_replicationビュー

説明
pidintegerWAL送信プロセスのプロセスID
usesysidoidこのWAL送信プロセスのユーザのOID
usenamenameこのWAL送信プロセスのユーザ名
application_nametextこのWAL送信プロセスに接続しているアプリケーション名
client_addrinet このWAL送信プロセスに接続しているクライアントのIPアドレス。もしこの列がNULLならば、クライアントはサーバマシンのUNIXソケット経由での接続であることを示します。
client_hostnametext client_addrのDNS逆引きにより通知される、接続しているクライアントのホスト名。この列はlog_hostnameが有効であり、またIP接続をしている時のみ非NULLとなります。
client_portinteger クライアントがこのWAL送信プロセスと通信を行う際に使用しているTCPポート番号。UNIXソケットが使用されている場合は-1となります。
backend_starttimestamp with time zone このプロセスが開始された時間。つまり、クライアントがWAL送信プロセスに接続した時間です。
statetext現在のWAL送信状態
sent_locationtextこの接続上での、最後に送信したトランザクションログの位置
write_locationtextこのスタンバイサーバで最後にディスクに書かれたトランザクションログの位置
flush_locationtextこのスタンバイサーバで最後にディスクに同期書き込みされたトランザクションログの位置
replay_locationtextこのスタンバイサーバで最後に再生されたトランザクションログの位置
sync_priorityinteger同期スタンバイ先に選択されるための、このスタンバイサーバの優先度
sync_statetextこのスタンバイサーバの同期状態

pg_stat_replicationビューは、WAL送信プロセス毎に1行を持ち、送信プロセスが接続しているスタンバイサーバとのレプリケーション統計情報を示します。 直接接続しているスタンバイサーバの情報のみがリストされ、カスケードされている下流のスタンバイサーバの情報は表示されません。

表 27-12. pg_stat_database_conflictsビュー

説明
datidoidデータベースのOID
datnamenameこのデータベースの名前
confl_tablespacebigintこのデータベースでのテーブルスペース削除によりキャンセルされた問い合わせ数
confl_lockbigintこのデータベースでのロックタイムアウトによりキャンセルされた問い合わせ数
confl_snapshotbigintこのデータベースでの古いスナップショット起因によりキャンセルされた問い合わせ数
confl_bufferpinbigintこのデータベースでのバッファへのピン止め起因によりキャンセルされた問い合わせ数
confl_deadlockbigintこのデータベースでのデッドロックによりキャンセルされた問い合わせ数

pg_stat_database_conflictsビューは、データベース毎に1行を持ち、スタンバイサーバでのリカバリとの競合によりキャンセルされた問い合わせについてのデータベース全体の統計情報を示します。 マスタサーバでは競合は発生しないため、このビューはスタンバイサーバでの情報のみを含んでいます。

27.2.3. 統計情報関数

統計情報を参照する他の方法について、上述の標準ビュー同様に、基礎的な統計情報アクセス関数を使用した問い合わせを作成することで設定できます。 関数の名前などの詳細については、標準ビューの定義を参考にしてください。(例えば、psqlでは\d+ pg_stat_activityで表示させることができます) データベース毎に統計情報へアクセスする関数は、どのデータベースの情報を通知するかを識別するため、データベースのOIDを引数として取ります。 テーブルやインデックス毎の関数であれば、テーブルやインデックスのOIDとなります。関数毎の統計情報用の関数は関数のOIDとなります。 これらの関数では、現在のデータベースにあるテーブル、インデックス、そして関数のみ確認できることに注意してください。

表27-13に、統計情報収集に関連する補助関数を記します。

表 27-13. 補助統計情報関数

関数戻り値の型説明
pg_backend_pid()integer 現在のセッションを制御しているサーバプロセスのプロセスID
pg_stat_get_activity(integer)setof record PIDが指定された場合、それに該当するバックエンドの情報のレコード、NULLが指定された場合はシステム上のアクティブな各バックエンドの情報がレコードが返されます。返される情報内容はpg_stat_activityの一部と同じです。
pg_stat_clear_snapshot()void 現在の統計情報スナップショットを廃棄します。
pg_stat_reset()void 現在のデータベースに関する統計カウンタすべてをゼロにリセットします(スーパーユーザ権限が必要です)。
pg_stat_reset_shared(text)void 引数に応じて、いくつかのデータベースクラスタ全体の統計情報カウンタをゼロに戻します(スーパーユーザ権限が必要です)。pg_stat_reset_shared('bgwriter')を呼び出すと、pg_stat_bgwriterビューのカウンタ値すべてがゼロになります。
pg_stat_reset_single_table_counters(oid)void 現在のデータベース内にある、ひとつのテーブルあるいはインデックスの統計情報をゼロにリセットします(スーパーユーザ権限が必要です)。
pg_stat_reset_single_function_counters(oid)void 現在のデータベース内にある、ひとつの関数の統計情報をゼロにリセットします(スーパーユーザ権限が必要です)。

pg_stat_activityビューの背後で実施されているpg_stat_get_activityは、各バックエンドに関する全ての有効な情報を含んだ行のセットを返します。 時には単純にこの情報の一部分を得るほうが便利なこともあります。このようなケースでは、表27-14に示されるような、より古いバックエンド毎への統計情報アクセス関数を使うことができます。 これらのアクセス関数は、1から現在活動中のバックエンドの数までの範囲を持つバックエンドIDという数値を使います。pg_stat_get_backend_idset関数は、これらの関数用にそれぞれのバックエンド用に1つの行を生成する機能を提供します。 全てのバックエンドのPIDと現在の問い合わせを表示する例を示します。

SELECT pg_stat_get_backend_pid(s.backendid) AS pid,
       pg_stat_get_backend_activity(s.backendid) AS query
    FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s;

表 27-14. バックエンド単位の統計情報関数

関数戻り値の型説明
pg_stat_get_backend_idset()setof integer 現在活動中のバックエンドID番号(1から活動中のバックエンド数まで)の集合。
pg_stat_get_backend_activity(integer)textこのバックエンドの最近の問い合わせ
pg_stat_get_backend_activity_start(integer)timestamp with time zone最近の問い合わせが開始された時間
pg_stat_get_backend_client_addr(integer)inetこのバックエンドに接続しているクライアントのIPアドレス
pg_stat_get_backend_client_port(integer)integerこのクライアントが通信に利用しているTCPポート番号
pg_stat_get_backend_dbid(integer)oidこのバックエンドが接続しているデータベースのOID
pg_stat_get_backend_pid(integer)integerこのバックエンドのプロセスID
pg_stat_get_backend_start(integer)timestamp with time zoneこのプロセスが開始された時間
pg_stat_get_backend_userid(integer)oidこのバックエンドにログインしているユーザのOID
pg_stat_get_backend_waiting(integer)booleanこのバックエンドがロック待ちかどうか。ロック待ちであれば真。
pg_stat_get_backend_xact_start(integer)timestamp with time zone現在のトランザクションが開始された時間