無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

F.28. pg_stat_statements

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

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

F.28.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   代表的な文の文字列 ( 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_dirtied bigint   文によりダーティ状態となった共有ブロックの総数
shared_blks_written bigint   SQL文によって書き込まれた共有ブロックの総数
local_blks_hit bigint   SQL文によってヒットしたローカルブロックキャッシュの総数
local_blks_read bigint   SQL文によって読み込まれたローカルブロックの総数
local_blks_dirtied bigint   SQL文によりダーティ状態となったローカルブロックの総数
local_blks_written bigint   SQL文によって書き込まれたローカルブロックの総数
temp_blks_read bigint   SQL文によって読み込まれた一時ブロックの総数
temp_blks_written bigint   SQL文によって書き込まれた一時ブロックの総数
blk_read_time double precision   SQL文がブロック読み取りに費やした、ミリ秒単位の総時間 ( track_io_timing が有効な場合。無効であればゼロ)
blk_write_time double precision   SQL文がブロック書き出しに費やした、ミリ秒単位の総時間 ( track_io_timing が有効な場合。無効であればゼロ)

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

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

計画作成が可能な問い合わせ(つまり SELECT INSERT UPDATE DELETE )は、内部のハッシュ計算に従った、同一の問い合わせ構造を持つ限り、1つの pg_stat_statements 項目に組み合わせられます。 典型的には、2つの問い合わせは、問い合わせの中に現れるリテラル定数の値以外、意味的に等価である場合、この目的では同一とみなされます。 しかし、ユーティリティコマンド(つまりこの他のコマンドすべて)は問い合わせ文字列のテキストを基に厳密に比較されます。

他の問い合わせと合致させるために定数値が無視された場合、 pg_stat_statements の表示の中で定数は ? に置換されます。 問い合わせの残りのテキストは、 pg_stat_statements 項目に関連付いた特定のハッシュ値を持つ、1つ目の問い合わせのテキストです。

一部の状況では、見た目上異なるテキストを持つ問い合わせが1つの pg_stat_statements 項目にまとめられることがあります。 通常これは意味的に等しい問い合わせでのみ発生しますが、関連がない問い合わせが1つの項目にまとめられるハッシュ競合の可能性がわずかながら存在します。 (しかしこれは別のユーザまたは別のデータベースに属する問い合わせでは発生することはあり得ません。)

ハッシュ値は問い合わせの解析後の表現に対して計算されますので、 search_path の設定が異なる等の要因の結果として異なる意味を持つ場合、同じテキストを持つ問い合わせが別の項目として現れるという、反対もまたあり得ます。

F.28.2. 関数

pg_stat_statements_reset() returns void

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

F.28.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 の中で設定しなければなりません。 典型的な使用方法は以下のようになります。

# postgresql.conf
shared_preload_libraries = 'pg_stat_statements'

pg_stat_statements.max = 10000
pg_stat_statements.track = all

F.28.4. サンプル出力

bench=# SELECT pg_stat_statements_reset();

$ pgbench -i bench
$ pgbench -c10 -t300 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 + ? WHERE bid = ?;
calls       | 3000
total_time  | 9609.00100000002
rows        | 2836
hit_percent | 99.9778970000200936
-[ RECORD 2 ]---------------------------------------------------------------------
query       | UPDATE pgbench_tellers SET tbalance = tbalance + ? WHERE tid = ?;
calls       | 3000
total_time  | 8015.156
rows        | 2990
hit_percent | 99.9731126579631345
-[ RECORD 3 ]---------------------------------------------------------------------
query       | copy pgbench_accounts from stdin
calls       | 1
total_time  | 310.624
rows        | 100000
hit_percent | 0.30395136778115501520
-[ RECORD 4 ]---------------------------------------------------------------------
query       | UPDATE pgbench_accounts SET abalance = abalance + ? WHERE aid = ?;
calls       | 3000
total_time  | 271.741999999997
rows        | 3000
hit_percent | 93.7968855088209426
-[ RECORD 5 ]---------------------------------------------------------------------
query       | alter table pgbench_accounts add primary key (aid)
calls       | 1
total_time  | 81.42
rows        | 0
hit_percent | 34.4947735191637631

F.28.5. 作者

Takahiro Itagaki 。 Peter Geoghegan により問い合わせの正規化が追加されました。


powered by SEO.CUG.NET