| PostgreSQL 9.0.4文書 | ||||
|---|---|---|---|---|
| 前のページ | 巻戻し | 付録 F. 追加で提供されるモジュール | 早送り | 次のページ |
pg_stat_statementsモジュールは、サーバで実行されたすべてのSQL文の実行時の統計情報を記録する手段を提供します。
このモジュールは追加の共有メモリを必要とするため、postgresql.confのshared_preload_librariesにpg_stat_statementsを追加してモジュールをロードしなければなりません。 このことは、このモジュールを追加もしくは削除するには、サーバを再起動する必要があるということを意味しています。
このモジュールにって収集された統計情報は、pg_stat_statementsというシステムビューを通して利用することができます。 このビューは、1行に対して、それぞれ個々の問い合わせ文字列、データベースID、およびユーザIDを含んでいます(モジュールが記録できるSQL文の最大数まで)。 ビューの列は、表F-20に示す通りです。
表 F-20. pg_stat_statements 列
| 名前 | 型 | 参照元 | 説明 |
|---|---|---|---|
| userid | oid | pg_authid.oid | SQL文を実行したユーザのOID |
| dbid | oid | pg_database.oid | SQL文が実行されたデータベースのOID |
| query | text | SQL文の文字列 (track_activity_query_size バイトまで) | |
| calls | bigint | 実行回数 | |
| total_time | double precision | SQL文の処理に費やした総時間(秒単位) | |
| rows | bigint | SQL文によって取得された、あるいは影響を受けた行の総数 | |
| shared_blks_hit | bigint | SQL文によって共有バッファから読み込まれた共有ブロックの総数 | |
| shared_blks_read | bigint | SQL文によってディスクから読み込まれた共有ブロックの総数 | |
| shared_blks_written | bigint | SQL文によってディスクに書き込まれた共有ブロックの総数 | |
| local_blks_hit | bigint | SQL文によって共有バッファから読み込まれたローカルブロックの総数 | |
| local_blks_read | bigint | SQL文によってディスクから読み込まれたローカルブロックの総数 | |
| local_blks_written | bigint | SQL文によってディスクへ書き込まれたローカルブロックの総数 | |
| temp_blks_read | bigint | SQL文によってディスクから読み込まれたテンポラリブロックの総数 | |
| temp_blks_written | bigint | SQL文によってディスクへ書き込まれたテンポラリブロックの総数 |
これらビューと関数pg_stat_statements_resetは、pg_stat_statements.sqlインストールスクリプトを実行することによって明示的にインストールされたデータベースのみで利用可能です。
しかしながら、統計情報はpg_stat_statementsモジュールがサーバにロードされていれば、ビューの存在に関わらず、サーバのすべてのデータベースについて記録されます。
セキュリティ上の理由から、スーパーユーザ以外のユーザは、他のユーザによって実行された問い合わせの文字列を見ることができません。 ただし、ユーザのデータベースにビューがインストールされている場合、統計情報についてはそれらユーザから見ることができます。
SQL文に含まれないパラメータにおいて、どのような値が使用されていたとしても、SQL文が同じ文字列であれば、それらは同じSQL文として扱われていることに注意してください。 SQL文に含まれないパラメータを使うことは、SQL文を分類することに役立ち、また、統計情報をより役立つようにするでしょう。
pg_stat_statements_reset() returns void
pg_stat_statements_resetはpg_stat_statementsによってこれまでに収集したすべての統計情報を削除します。
デフォルトでは、この関数はスーパーユーザのみ実行することができます。
pg_stat_statements.maxは、このモジュールによって記録されるSQL文の最大数(すなわち、pg_stat_statementsビューにおける行の最大数)です。これを超えて異なるSQL文を検出した場合は、最も実行回数の低いSQL文の情報が捨てられます。 デフォルトは1000です。 このパラメータはサーバの起動時にのみ指定できます。
pg_stat_statements.trackは、どのSQL文をモジュールによって計測するかを制御します。 topを指定した場合は(直接クライアントによって発行された)最上層のSQL文を記録します。 allは(関数の中から呼び出された文などの)入れ子になった文も記録します。 noneは無効にします。 デフォルトはtopです。 この設定はスーパーユーザだけが変更できます。
pg_stat_statements.track_utilityは、このモジュールがユーティリティコマンドを記録するかどうかを指定します。 ユーティリティコマンドとは、 SELECT、INSERT、UPDATEおよびDELETE以外のすべてです。 デフォルトはonです。 この設定はスーパーユーザーのみが変更できます。
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
bench=# SELECT pg_stat_statements_reset();
$ pgbench -i bench
$ pgbench -c10 -t300 -M prepared bench
bench=# \x
bench=# SELECT query, calls, total_time, rows, 100.0 * shared_blks_hit /
nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent
FROM pg_stat_statements ORDER BY total_time DESC LIMIT 5;
-[ RECORD 1 ]---------------------------------------------------------------------
query | UPDATE pgbench_branches SET bbalance = bbalance + $1 WHERE bid = $2;
calls | 3000
total_time | 9.60900100000002
rows | 2836
hit_percent | 99.9778970000200936
-[ RECORD 2 ]---------------------------------------------------------------------
query | UPDATE pgbench_tellers SET tbalance = tbalance + $1 WHERE tid = $2;
calls | 3000
total_time | 8.015156
rows | 2990
hit_percent | 99.9731126579631345
-[ RECORD 3 ]---------------------------------------------------------------------
query | copy pgbench_accounts from stdin
calls | 1
total_time | 0.310624
rows | 100000
hit_percent | 0.30395136778115501520
-[ RECORD 4 ]---------------------------------------------------------------------
query | UPDATE pgbench_accounts SET abalance = abalance + $1 WHERE aid = $2;
calls | 3000
total_time | 0.271741999999997
rows | 3000
hit_percent | 93.7968855088209426
-[ RECORD 5 ]---------------------------------------------------------------------
query | alter table pgbench_accounts add primary key (aid)
calls | 1
total_time | 0.08142
rows | 0
hit_percent | 34.4947735191637631 Takahiro Itagaki <itagaki.takahiro@oss.ntt.co.jp>