Personal tools

稼動統計情報を活用しよう(3)

NTT オープンソースソフトウェアセンタ 笠原 辰仁


有用な情報を持つテーブル / ビュー

稼動統計情報を持つテーブルとビューの一部について、どのような情報を蓄積しているかを紹介します。前ページで稼動統計情報の取得方法を述べましたが、紹介したもの以外にも、下記に示すように色々な情報が取得できます。

pg_stat_database

DB単位で、実施された表スキャンやインデックススキャン数などが確認できます。DB単位でざっくりとしたアクティビティ状況を確認するのに便利です。このビューでは下記の項目を確認できます。

pg_stat_database
名前ver.説明
datid
データベースのOID
datname
データベース名
numbackends
接続中のバックエンドプロセス数
xact_commit
コミットされた回数
xact_rollback
ロールバック(アボート)された回数
blks_read
ブロックリード数
blks_hit
ブロックのキャッシュヒット数
tup_returned8.3表スキャンでの読み取り行数
tup_fetched8.3インデックススキャンでの読み取り行数
tup_inserted8.3INSERTされた行数
tup_updated8.3UPDATEされた行数
tup_deleted8.3DELETEされた行数

pg_stat_user_tables / pg_stat_sys_tables / pg_stat_all_tables

各テーブルへ実施された表スキャンやインデックススキャン回数など詳細な情報が確認できます。*_user_tablesはユーザテーブルの情報、*_sys_tablesはシステムカタログの情報、*_all_tablesはユーザテーブルとシステムテーブル双方の情報を、それぞれ出力します。通常はpg_stat_user_tablesを見ておけば良いです。このビューでは下記の項目を確認できます。

pg_stat_*_tables
名前ver.説明
relid
テーブルのOID
schemaname
スキーマ名
relname
テーブル名
seq_scan
このテーブルに対する表スキャンの実行回数
seq_tup_read
表スキャンによって読みとられた行数
idx_scan
このテーブルに対するインデックススキャンの実行回数
idx_tup_fetch
インデックススキャンで読み取られた行数
n_tup_ins
INSERTされた行数
n_tup_upd
UPDATEされた行数 (HOT更新されたものも含む)
n_tup_del
DELETEされた行数
n_tup_hot_upd8.3HOT更新された行数
n_live_tup8.3保持されている有効な行数
n_dead_tup8.3不要な(ガベージとなっている)行数
last_vacuum8.2このテーブルに対する最後の VACUUM の完了時刻
last_autovacuum8.2このテーブルに対する最後の autovacuum (VACUUM) の完了時刻
last_analyze8.2このテーブルに対する最後の ANALYZE の完了時刻
last_autoanalyze8.2このテーブルに対する最後の autovacuum (ANALYZE) の完了時刻

pg_stat_user_indexes / pg_stat_sys_indexes / pg_stat_all_indexes

各インデックスへ実施されたスキャン回数が確認できます。user_indexes、sys_indexesなどの違いは、pg_stat_*_tablesと同様です。

pg_stat_*_indexes
名前説明
relidインデックスが付与されているテーブルのOID
indexrelidインデックスのOID
schemanameスキーマ名
relnameテーブル名
indexrelnameインデックス名
idx_scanインデックススキャン実施回数
idx_tup_readインデックススキャンによって読み取られたインデックスエントリの数
idx_tup_fetchIndexScanによって読み取られたエントリの数 (BitmapScan によるものを除く)

pg_statio_user_tables / pg_statio_sys_tables / pg_statio_all_tables

各テーブルへ実施されたブロックアクセス状況が確認できます。user_tables、sys_tablesなどの違いは、pg_stat_*_tablesと同様です。

pg_statio_*_tables
名前説明
relidテーブルのOID
schemanameスキーマ名
relnameテーブル名
heap_blks_readテーブルブロックの読み込み数
heap_blks_hitキャッシュヒットしたテーブルブロック数
idx_blks_readインデックスブロックの読み込み数
idx_blks_hitキャッシュヒットしたインデックスブロック数
toast_blks_readTOASTテーブルのブロックの読み込み数
toast_blks_hitキャッシュヒットしたTOASTテーブルのブロック数
tidx_blks_readTOASTインデックスのブロックの読み込み数
tidx_blks_hitキャッシュヒットしたTOASTインデックスのブロック数

pg_statio_user_indexes / pg_statio_sys_indexes / pg_statio_all_indexes

各インデックスへ実施されたブロックアクセス状況が確認できます。user_indexes、sys_indexesなどの違いは、pg_stat_*_tablesと同様です。

pg_statio_*_indexes
名前説明
relidインデックスの付与されているテーブルのOID
indexrelidインデックスのOID
schemanameスキーマのOID
relnameテーブル名
indexrelnameインデックス名
idx_blks_readインデックスブロックの読み込み数
idx_blks_hitキャッシュヒットしたインデックスのブロック数

pg_stat_activity

現在実施中の処理内容や開始時間を確認できます。

pg_stat_activity
名前ver.説明
datid
処理が実施されているDBのOID
datname
DB名
procpid
プロセスID
usesysid
処理を実施しているユーザのOID
usename
ユーザ名
current_query
現在実施されている問い合わせ
  • IDLE: 接続しているだけでアイドル
  • IDLE in transaction: トランザクション中でアイドル
waiting8.2処理がロック待ちかどうか (tならロック待ち)
query_start
現在実施されている処理の開始時刻
xact_start8.3トランザクションの開始時刻
backend_start8.1接続しているバックエンドの開始時刻
client_addr8.1クライアントのIPアドレス (localhostの場合はNULL)
client_port8.1現在接続しているポート番号 (UNIXのドメインソケットの場合は-1)

pg_locks

PostgreSQLで現在実施されている処理のロック状況を確認できます。pg_stat_activityなどと組み合わせると、ロックを保持している処理などが把握できます。

テーブルの内容はJPUGのマニュアルを参考にして下さい。(PostgreSQL 文書: pg_locks)

pg_class

DB内のテーブルやインデックスのメタ情報を管理するテーブルです。稼動統計情報やシステムカタログと組み合わせて使用することが多いです。典型的には、OID (PostgreSQLインスタンスで一意となるオブジェクトID) とオブジェクト名 (テーブル名やインデックス名) を結びつける際に pg_class が用いられます。OID は下記の様に pg_class のシステムカラム oid (隠しカラム) を指定することで確認できます。同じ名前のテーブルが異なるスキーマにある場合などは、テーブル名ではなくOIDで判別/結合すると安心です。

-- 2つのスキーマに 'test' テーブルがある場合
=# SELECT oid, relname, relnamespace FROM pg_class WHERE relname='test';
oid | relname | relnamespace
-------+---------+--------------
24958 | test | 2200
24965 | test | 24964
(2 rows)

テーブルの内容はJPUGのマニュアルを参考にして下さい。(PostgreSQL 文書: pg_class)

稼動統計情報に関する注意点

稼動統計情報を扱う上で、以下の注意点を覚えておいて下さい。

PostgreSQLのクラッシュ発生時に情報がクリアされる

稼動統計情報は常時メモリ上に存在しており、PostgreSQLの停止時にはファイルに書き出され、再び起動された際にそのファイルを読み込んでメモリ上に展開されます。そのため、PostgreSQLのクラッシュ時は統計情報のダンプが適切にされないため、稼動統計情報がクリアされます。

外部リンク

稼動統計情報については、JPUGオンラインマニュアルの「統計情報収集のための設定」や「収集した統計情報の表示」に詳細な情報が記載されています。


さて、いかがでしたでしょうか?ここで紹介したもの以外にも、PostgreSQLはたくさんの情報を収集・保持しています。これらを使いこなせると、チューニングやトラブルシューティングを効果的に行うことができます。是非、活用してみてください。

 

You are here: Home 読み物 技術的な記事 統計情報の活用 稼動統計情報を活用しよう(3)