バージョンごとのドキュメント一覧

F.3. auto_explain — 低速な問い合わせ実行計画のログ #

<title>auto_explain &mdash; log execution plans of slow queries</title>

The <filename>auto_explain</filename> module provides a means for logging execution plans of slow statements automatically, without having to run <xref linkend="sql-explain"/> by hand. This is especially helpful for tracking down un-optimized queries in large applications. auto_explainモジュールは、手動でEXPLAINの実行を必要とせず、自動的に遅い文の実行計画をログ記録する手段を提供します。 大きなアプリケーションにおける最適化されていない問い合わせを追跡するのに特に有用です。

The module provides no SQL-accessible functions. To use it, simply load it into the server. You can load it into an individual session: このモジュールはSQLでアクセスできる関数を提供しません。 使用するには、サーバに単に読み込ませます。 ある個別のセッションに読み込ませることができます。

LOAD 'auto_explain';

(You must be superuser to do that.) More typical usage is to preload it into some or all sessions by including <literal>auto_explain</literal> in <xref linkend="guc-session-preload-libraries"/> or <xref linkend="guc-shared-preload-libraries"/> in <filename>postgresql.conf</filename>. Then you can track unexpectedly slow queries no matter when they happen. Of course there is a price in overhead for that. (実行するためにはスーパーユーザでなければなりません。) より一般的な使用方法は、postgresql.confsession_preload_librariesまたはshared_preload_librariesauto_explainを含めて、特定のまたはすべてのセッションで事前にロードしておくことです。 すると、想定外に低速な問い合わせを発生時に何も行うことなく追跡することができます。 当然ながらこのためのオーバーヘッドという代償があります。

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

<title>Configuration Parameters</title>

There are several configuration parameters that control the behavior of <filename>auto_explain</filename>. Note that the default behavior is to do nothing, so you must set at least <varname>auto_explain.log_min_duration</varname> if you want any results. auto_explainの動作を制御するいくつかの設定パラメータが存在します。 デフォルトの動作は何もしないことなので、なんらかの結果を望むのであれば少なくともauto_explain.log_min_durationを設定しなければならないことに注意してください。

auto_explain.log_min_duration (integer) #

<varname>auto_explain.log_min_duration</varname> is the minimum statement execution time, in milliseconds, that will cause the statement's plan to be logged. Setting this to <literal>0</literal> logs all plans. <literal>-1</literal> (the default) disables logging of plans. For example, if you set it to <literal>250ms</literal> then all statements that run 250ms or longer will be logged. Only superusers can change this setting. auto_explain.log_min_durationは、文の実行計画がログに記録されるようになる、ミリ秒単位の最小の文実行時間です。 これを0にすれば、すべての計画が記録されます。 -1(デフォルト)は計画の記録を無効にします。 例えば、250msに設定すると、250ms以上実行する文すべてが記録されます。 スーパーユーザのみがこの設定を変更することができます。

auto_explain.log_parameter_max_length (integer) #

<varname>auto_explain.log_parameter_max_length</varname> controls the logging of query parameter values. A value of <literal>-1</literal> (the default) logs the parameter values in full. <literal>0</literal> disables logging of parameter values. A value greater than zero truncates each parameter value to that many bytes. Only superusers can change this setting. auto_explain.log_parameter_max_lengthは、問い合わせパラメータ値を記録するか制御します。 -1という値(デフォルト)は、パラメータ値を完全に記録します。 0はパラメータ値の記録を無効にします。 ゼロより大きい値は、各パラメータ値を指定されたバイト数に切り捨てます。 この設定を変更できるのは、スーパーユーザのみです。

auto_explain.log_analyze (boolean) #

<varname>auto_explain.log_analyze</varname> causes <command>EXPLAIN ANALYZE</command> output, rather than just <command>EXPLAIN</command> output, to be printed when an execution plan is logged. This parameter is off by default. Only superusers can change this setting. auto_explain.log_analyzeは、実行計画のログが取得されたときに出力されるものとして、単にEXPLAIN出力ではなく、EXPLAIN ANALYZE出力を行います。 このパラメータはデフォルトで無効です。 スーパーユーザのみがこの設定を変更できます。

注記

When this parameter is on, per-plan-node timing occurs for all statements executed, whether or not they run long enough to actually get logged. This can have an extremely negative impact on performance. Turning off <varname>auto_explain.log_timing</varname> ameliorates the performance cost, at the price of obtaining less information. このパラメータが有効の場合、計画ノードごとの時間的調整は事実上ログされるまで如何に時間が掛かろうと、全ての実行文に対して引き起こります。 極端に性能上のマイナスの影響が起こり得ます。 auto_explain.log_timingを無効にすれば、得られる情報が少なくなるという犠牲を払って、性能の損失が改善されます。

auto_explain.log_buffers (boolean) #

<varname>auto_explain.log_buffers</varname> controls whether buffer usage statistics are printed when an execution plan is logged; it's equivalent to the <literal>BUFFERS</literal> option of <command>EXPLAIN</command>. This parameter has no effect unless <varname>auto_explain.log_analyze</varname> is enabled. This parameter is off by default. Only superusers can change this setting. auto_explain.log_buffersは実行計画のログを取得するときに、バッファ使用統計を出力するかどうかを制御します。 EXPLAINBUFFERSオプションと同じです。 auto_explain.log_analyzeパラメータが設定されていなければ、このパラメータは効果がありません。 このパラメータはデフォルトで無効です。 スーパーユーザのみがこの設定を変更することができます。

auto_explain.log_wal (boolean) #

<varname>auto_explain.log_wal</varname> controls whether WAL usage statistics are printed when an execution plan is logged; it's equivalent to the <literal>WAL</literal> option of <command>EXPLAIN</command>. This parameter has no effect unless <varname>auto_explain.log_analyze</varname> is enabled. This parameter is off by default. Only superusers can change this setting. auto_explain.log_walは実行計画のログを取得するときに、WAL使用統計を出力するかどうかを制御します。 EXPLAINWALオプションと同じです。 auto_explain.log_analyzeパラメータが設定されていなければ、このパラメータは効果がありません。 このパラメータはデフォルトで無効です。 スーパーユーザのみがこの設定を変更することができます。

auto_explain.log_timing (boolean) #

<varname>auto_explain.log_timing</varname> controls whether per-node timing information is printed when an execution plan is logged; it's equivalent to the <literal>TIMING</literal> option of <command>EXPLAIN</command>. The overhead of repeatedly reading the system clock can slow down queries significantly on some systems, so it may be useful to set this parameter to off when only actual row counts, and not exact times, are needed. This parameter has no effect unless <varname>auto_explain.log_analyze</varname> is enabled. This parameter is on by default. Only superusers can change this setting. auto_explain.log_timingは、実行計画のログが取得されたときに、ノード毎の時間的調整情報を出力するかどうかを制御します。 EXPLAINTIMINGオプションと同じです。 システムクロックを繰り返し読み出すことによるオーバーヘッドのため、システムの中には問い合わせが非常に遅くなるものがありますので、実際の行数のみ必要で正確な時刻は必要でない場合にはこのパラメータを無効にすると役に立つかも知れません。 auto_explain.log_analyzeが設定されていなければ、このパラメータは効果がありません。 デフォルトで有効です。 スーパーユーザのみがこの設定を変更することができます。

auto_explain.log_triggers (boolean) #

<varname>auto_explain.log_triggers</varname> causes trigger execution statistics to be included when an execution plan is logged. This parameter has no effect unless <varname>auto_explain.log_analyze</varname> is enabled. This parameter is off by default. Only superusers can change this setting. auto_explain.log_triggersにより、実行計画のログを記録するときに、トリガ実行の統計を含めるようになります。 auto_explain.log_analyzeパラメータが設定されていなければ、このパラメータは効果がありません。 このパラメータはデフォルトで無効です。 スーパーユーザのみがこの設定を変更することができます。

auto_explain.log_verbose (boolean) #

<varname>auto_explain.log_verbose</varname> controls whether verbose details are printed when an execution plan is logged; it's equivalent to the <literal>VERBOSE</literal> option of <command>EXPLAIN</command>. This parameter is off by default. Only superusers can change this setting. auto_explain.log_verboseは、実行計画のログが取得されたときに、冗長な詳細が出力されるかどうかを制御します。 EXPLAINVERBOSEオプションと同じです。 このパラメータはデフォルトで無効です。 スーパーユーザのみがこの設定を変更できます。

auto_explain.log_settings (boolean) #

<varname>auto_explain.log_settings</varname> controls whether information about modified configuration options is printed when an execution plan is logged. Only options affecting query planning with value different from the built-in default value are included in the output. This parameter is off by default. Only superusers can change this setting. auto_explain.log_settingsは、実行計画が記録される時に修正された設定オプションに関する情報を表示するかどうかを制御します。 問い合わせ計画に影響し、組み込みのデフォルトの値と異なる値であるオプションだけが出力に含まれます。 このパラメータはデフォルトで無効です。 スーパーユーザのみがこの設定を変更できます。

auto_explain.log_format (enum) #

<varname>auto_explain.log_format</varname> selects the <command>EXPLAIN</command> output format to be used. The allowed values are <literal>text</literal>, <literal>xml</literal>, <literal>json</literal>, and <literal>yaml</literal>. The default is text. Only superusers can change this setting. auto_explain.log_formatは使用するEXPLAIN出力書式を選びます。 許容される値はtextxmljsonyamlです。 デフォルトはtextです。 スーパーユーザのみがこの設定を変更することができます。

auto_explain.log_level (enum) #

<varname>auto_explain.log_level</varname> selects the log level at which auto_explain will log the query plan. Valid values are <literal>DEBUG5</literal>, <literal>DEBUG4</literal>, <literal>DEBUG3</literal>, <literal>DEBUG2</literal>, <literal>DEBUG1</literal>, <literal>INFO</literal>, <literal>NOTICE</literal>, <literal>WARNING</literal>, and <literal>LOG</literal>. The default is <literal>LOG</literal>. Only superusers can change this setting. auto_explain.log_levelは、auto_explainが問い合わせ計画を記録するログレベルを選択します。 有効な値はDEBUG5DEBUG4DEBUG3DEBUG2DEBUG1INFONOTICEWARNINGLOGです。 デフォルトはLOGです。 スーパーユーザのみがこの設定を変更できます。

auto_explain.log_nested_statements (boolean) #

<varname>auto_explain.log_nested_statements</varname> causes nested statements (statements executed inside a function) to be considered for logging. When it is off, only top-level query plans are logged. This parameter is off by default. Only superusers can change this setting. auto_explain.log_nested_statementsにより、入れ子状の文(関数内から実行される文)を考慮して記録するようになります。 無効ならば、最上位の問い合わせ計画のみが記録されます。 このパラメータはデフォルトで無効です。 スーパーユーザのみがこの設定を変更することができます。

auto_explain.sample_rate (real) #

<varname>auto_explain.sample_rate</varname> causes auto_explain to only explain a fraction of the statements in each session. The default is 1, meaning explain all the queries. In case of nested statements, either all will be explained or none. Only superusers can change this setting. auto_explain.sample_rateにより、auto_explainは各セッションで一部の文の実行計画のみをログに記録するようになります。 デフォルトは1で、すべての問い合わせの実行計画をログに記録します。 入れ子になった文の場合には、実行計画がすべてログに記録されるか、全くされないかのどちらかです。 スーパーユーザのみがこの設定を変更できます。

In ordinary usage, these parameters are set in <filename>postgresql.conf</filename>, although superusers can alter them on-the-fly within their own sessions. Typical usage might be: スーパーユーザは自身のセッション内でその場で変更できますが、通常の使用では、これらパラメータはpostgresql.confに設定しなければなりません。 典型的な使用方法は以下のようになります。

# postgresql.conf
session_preload_libraries = 'auto_explain'

auto_explain.log_min_duration = '3s'

F.3.2. 例 #

<title>Example</title>
postgres=# LOAD 'auto_explain';
postgres=# SET auto_explain.log_min_duration = 0;
postgres=# SET auto_explain.log_analyze = true;
postgres=# SELECT count(*)
           FROM pg_class, pg_index
           WHERE oid = indrelid AND indisunique;

This might produce log output such as: これにより、以下のようなログ出力が作成されます。

LOG:  duration: 3.651 ms  plan:
  Query Text: SELECT count(*)
              FROM pg_class, pg_index
              WHERE oid = indrelid AND indisunique;
  Aggregate  (cost=16.79..16.80 rows=1 width=0) (actual time=3.626..3.627 rows=1 loops=1)
    ->  Hash Join  (cost=4.17..16.55 rows=92 width=0) (actual time=3.349..3.594 rows=92 loops=1)
          Hash Cond: (pg_class.oid = pg_index.indrelid)
          ->  Seq Scan on pg_class  (cost=0.00..9.55 rows=255 width=4) (actual time=0.016..0.140 rows=255 loops=1)
          ->  Hash  (cost=3.02..3.02 rows=92 width=4) (actual time=3.238..3.238 rows=92 loops=1)
                Buckets: 1024  Batches: 1  Memory Usage: 4kB
                ->  Seq Scan on pg_index  (cost=0.00..3.02 rows=92 width=4) (actual time=0.008..3.187 rows=92 loops=1)
                      Filter: indisunique

F.3.3. 作者 #

<title>Author</title>

Takahiro Itagaki <email>itagaki.takahiro@oss.ntt.co.jp</email> 板垣 貴裕