pg_stat_statementsモジュールはサーバで実行されたすべてのSQL文の実行時の統計情報を記録する手段を提供します。
追加の共有メモリを必要とするため、postgresql.confでpg_stat_statementsをshared_preload_librariesに追加することによって、モジュールをロードしなければなりません。 そのモジュールを追加もしくは削除するにはサーバを再起動させる必要があるということを意味しています。
モジュールにより集められた統計情報はpg_stat_statementsというシステムビューにより利用することができます。 このビューはそれぞれ個別の問い合わせテキスト、データベースID、およびユーザID(モジュールが追跡できる個別の文の最大数まで)に対して1つの行を含んでいます。 ビューの列は表F-24に示す通りです。
表 F-24. pg_stat_statements 列
名称 | 型 | 参照元 | 説明 |
---|---|---|---|
userid | oid | pg_authid.oid | 文を実行したユーザのOID |
dbid | oid | pg_database.oid | 文が実行されたデータベースのOID |
query | text | 文のテキスト (track_activity_query_size バイトまで) | |
calls | bigint | 実行回数 | |
total_time | double precision | 文処理に費やした総時間(秒単位) | |
rows | bigint | 文で検索されるか、または影響を受ける行の総数 |
このビューと関数pg_stat_statements_reset
は、pg_stat_statements.sqlを実行することによって明示的にインストールされたデータベースのみで利用可能です。
しかしながら、統計情報はpg_stat_statementsモジュールがサーバにロードされていれば、ビューの存在に関わらず、サーバのすべてのデータベースについて記録されます。
セキュリティ上の理由から、スーパーユーザ以外のユーザは、他のユーザによって実行された問い合わせのテキストを見ることができません。 ただし、ビューがそれらユーザのデータベースにインストールされている場合、統計情報についてはそれらユーザから見ることができます。
文で範囲外のパラメタ値が使用されていても、それらに同じテキストがあれば、文は同じものとして扱われていることに注意してください。 範囲外のパラメタを使うことは文を分類することに役立ち、また、統計情報をより役立つようにするでしょう。
pg_stat_statements_reset() returns void
pg_stat_statements_reset
はpg_stat_statementsによってこれまでに集めたすべての統計情報を捨てます。
デフォルトでは、この関数はスーパーユーザのみ実行することができます。
pg_stat_statements.maxは、モジュールにより記録される文の最大数(すなわち、pg_stat_statementsビューにおける行の最大数)です。これを超える異なった文を検出した場合は、最も実行回数の低い文の情報が捨てられます。 デフォルトは1000です。 このパラメータはサーバ開始時にのみ指定できます。
pg_stat_statements.trackは、モジュールによりカウントされる文を制御します。 topを指定した場合は(直接クライアントによって発行された)最上階層の文を記録します。 allは(関数の中から呼び出された文などの)入れ子になった文も記録します。 noneは無効にします。 デフォルトはtopです。 スーパーユーザだけがこの設定を変更することができます。
pg_stat_statements.saveは、サーバを終了させる際に文の統計情報を保存するかどうかを指定します。 offの場合、統計情報は終了時に保存されず、サーバ開始時に再読み込みもされません。 デフォルト値はonです。 このパラメータはpostgresql.confファイル、またはサーバコマンドラインでのみ設定できます。
このモジュールはおよそpg_stat_statements.max * track_activity_query_sizeバイト量の追加の共有メモリを必要とします。 pg_stat_statements.trackにnoneが設定されていても、モジュールがロードされているときは常にこのメモリが消費されることに注意してください。
postgresql.confに、これらのパラメータの値を設定するためには、custom_variable_classesにpg_stat_statementsを追加する必要があります。 標準的な使用例は次の通りです。
# postgresql.conf shared_preload_libraries = 'pg_stat_statements' custom_variable_classes = 'pg_stat_statements' pg_stat_statements.max = 10000 pg_stat_statements.track = all
$ pgbench -i bench postgres=# SELECT pg_stat_statements_reset(); $ pgbench -c10 -t300 -M prepared bench postgres=# \x postgres=# SELECT * FROM pg_stat_statements ORDER BY total_time DESC LIMIT 3; -[ RECORD 1 ]------------------------------------------------------------ userid | 10 dbid | 63781 query | UPDATE branches SET bbalance = bbalance + $1 WHERE bid = $2; calls | 3000 total_time | 20.716706 rows | 3000 -[ RECORD 2 ]------------------------------------------------------------ userid | 10 dbid | 63781 query | UPDATE tellers SET tbalance = tbalance + $1 WHERE tid = $2; calls | 3000 total_time | 17.1107649999999 rows | 3000 -[ RECORD 3 ]------------------------------------------------------------ userid | 10 dbid | 63781 query | UPDATE accounts SET abalance = abalance + $1 WHERE aid = $2; calls | 3000 total_time | 0.645601 rows | 3000
Takahiro Itagaki <itagaki.takahiro@oss.ntt.co.jp>