pg_stat_statements

PostgreSQL 9.1.1文書
前のページ | 巻戻し | 付録 F. 追加で提供されるモジュール | 早送り | 次のページ

# F.32. pg_stat_statements

`pg_stat_statements`モジュールは、サーバで実行されたすべてのSQL文の実行時の統計情報を記録する手段を提供します。

このモジュールは追加の共有メモリを必要とするため、`postgresql.conf`のshared_preload_librariesに`pg_stat_statements`を追加してモジュールをロードしなければなりません。 このことは、このモジュールを追加もしくは削除するには、サーバを再起動する必要があるということを意味しています。

## F.32.1. `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`拡張機能をインストールすることで明示的にインストールされたデータベースのみで利用可能です。 しかしながら、統計情報は`pg_stat_statements`モジュールがサーバにロードされていれば、ビューの存在に関わらず、サーバのすべてのデータベースについて記録されます。

セキュリティ上の理由から、スーパーユーザ以外のユーザは、他のユーザによって実行された問い合わせの文字列を見ることができません。 ただし、ユーザのデータベースにビューがインストールされている場合、統計情報についてはそれらユーザから見ることができます。

SQL文に含まれないパラメータにおいて、どのような値が使用されていたとしても、SQL文が同じ文字列であれば、それらは同じSQL文として扱われていることに注意してください。 SQL文に含まれないパラメータを使うことは、SQL文を分類することに役立ち、また、統計情報をより役立つようにするでしょう。

## F.32.2. 関数

`pg_stat_statements_reset() returns void`

  `pg_stat_statements_reset`は`pg_stat_statements`によってこれまでに収集したすべての統計情報を削除します。 デフォルトでは、この関数はスーパーユーザのみ実行することができます。

## F.32.3. 設定パラメータ

`pg_stat_statements.max` (`integer`)

  `pg_stat_statements.max`は、このモジュールによって記録されるSQL文の最大数(すなわち、`pg_stat_statements`ビューにおける行の最大数)です。これを超えて異なるSQL文を検出した場合は、最も実行回数の低いSQL文の情報が捨てられます。 デフォルトは1000です。 このパラメータはサーバの起動時にのみ指定できます。

`pg_stat_statements.track` (`enum`)

  `pg_stat_statements.track`は、どのSQL文をモジュールによって計測するかを制御します。 `top`を指定した場合は（直接クライアントによって発行された）最上層のSQL文を記録します。 `all`は（関数の中から呼び出された文などの）入れ子になった文も記録します。 `none`は無効にします。 デフォルトは`top`です。 この設定はスーパーユーザだけが変更できます。

`pg_stat_statements.track_utility` (`boolean`)

  `pg_stat_statements.track_utility`は、このモジュールがユーティリティコマンドを記録するかどうかを指定します。 ユーティリティコマンドとは、 `SELECT`、`INSERT`、`UPDATE`および`DELETE`以外のすべてです。 デフォルトは`on`です。 この設定はスーパーユーザのみが変更できます。

`pg_stat_statements.save` (`boolean`)

  `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

## F.32.4. サンプル出力

    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

## F.32.5. 作者

Takahiro Itagaki `<itagaki.takahiro@oss.ntt.co.jp>`

前のページ | ホーム | 次のページ
pg_standby | 上に戻る | pgstattuple