もた日記

くだらないことを真面目にやる

pev, gocmdpevでPostgreSQLのEXPLAINを見やすくする

pev


github.com

Postgres Explain Visualizer (pev)を使うとPostgreSQLのEXPLAINをグラフィカルに表示できるので試してみる。

f:id:wonder-wall:20170913211229p:plain

インストール


tatiyants.com/pevにWebアプリがあるので、まずはここで試してみるのがよい。

以下のようにすればローカルでも動かせるらしいがうまく動かなかった…。

$ git clone https://github.com/AlexTatiyants/pev
$ cd pev
$ npm install
$ npm start

下記も必要かも
$ npm install tsd -g
$ gem install compass


使い方


Webアプリにアクセスして"NEW PLAN"→"CREATE A SAMPLE PLAN"→"SUBMIT"でサンプルの結果が表示される。
上部の"paste execution plan"にはSQLの先頭にEXPLAIN (ANALYZE, COSTS, VERBOSE, BUFFERS, FORMAT JSON)を追加して実行した結果を、 下部の"paste corresponding SQL query"にはSQLを貼り付ければよい。
pevでは結果をクリックするとノードの詳細や、関連するSQLを見ることができる。詳細については作者のブログを参照。

f:id:wonder-wall:20170913213526p:plain

gocmdpev


github.com

gocmdpevはGoで書かれたコマンドライン版のpev。pevにインスパイアされたとのこと。

f:id:wonder-wall:20170913205841p:plain

インストール


Goで書かれているので下記コマンドを実行する。

$ go get -u github.com/simon-engledew/gocmdpev

masOSの場合はbrewでインストールすることも可能。

$ brew tap simon-engledew/gocmdpev
$ brew install gocmdpev

ヘルプメッセージ

$ gocmdpev --version
1.0.1
$ gocmdpev --help
usage: gocmdpev [<flags>]

A command-line GO Postgres query visualizer (see https://github.com/simon-engledew/gocmdpev).

Flags:
  -h, --help     Show context-sensitive help (also try --help-long and --help-man).
  -v, --version  Show application version.


使い方


pevと同様にSQLの先頭に下記のEXPLAIN行を追加して、EXPLAINの結果をgocmdpevに渡せばよい。

EXPLAIN (ANALYZE, COSTS, VERBOSE, BUFFERS, FORMAT JSON)

例えば、macOSの場合はSQLをコピー後に下記コマンドで実行できる。

$ pbpaste | sed '1s/^/EXPLAIN (ANALYZE, COSTS, VERBOSE, BUFFERS, FORMAT JSON) /' | psql -qXAt <DATABASE> | gocmdpev


EXPLAINのパラメータについて


pev, gocmdpevで指定しているEXPLAIN(問い合わせ文の実行計画を表示する)のパラメータはPostgreSQLドキュメントによると下記とのこと。

ANALYZE

コマンドを実行し、実際の実行時間やその他の統計情報を表示します。 このパラメータのデフォルトはFALSEです。

 

COSTS

各計画ノードの推定起動コストと総コスト、さらに推定行数と各行の推定幅に関する情報を含めます。 このパラメータのデフォルトはTRUEです。

 

VERBOSE

計画についての追加情報を出力します。 具体的には、計画ツリー、スキーマ修飾テーブル、関数名内の各ノードに対して出力列リストを含めます。 常に範囲テーブルの別名を付けて式内の変数を命名し、また常に統計情報が表示される各トリガの名前を出力します。 このパラメータのデフォルトはFALSEです。

 

BUFFERS

バッファの使用状況に関する情報を含めます。 具体的には、共有ブロックのヒット数、読み取り数、ダーティブロック数、書き出し数、ローカルブロックのヒット数、ダーティブロック数、読み取り数、書き出し数、一時ブロックの読み取り数、書き出し数が含められます。 ヒットとは、必要な時にキャッシュ内にそのブロックが見つかったため読み取りが避けられたことを意味します。 共有ブロックには、通常のテーブルとインデックスからのデータが含まれます。 ローカルブロックには、一時テーブルとそのインデックスからのデータが含まれます。 一時ブロックには、ソートやハッシュ、マテリアライズ計画ノードなどで使用される短期間有効なデータが含まれます。 ダーティブロック数は、これまでは変更がなかったがその問い合わせによって変更されたブロックの数を示します。 書き出しブロック数は、問い合わせ処理の間にバックエンドにより、ダーティ状態だったブロックの内キャッシュから追い出されたブロックの数を示します。 上位レベルのノードで表示されるブロック数には、その子ノードすべてで使用されるブロックが含まれます。 テキスト形式では、非ゼロの値のみが出力されます。 このパラメータはANALYZEパラメータも有効である場合にのみ使用することができます。 デフォルトはFALSEです。

 

FORMAT

出力形式を指定します。 TEXT、XML、JSON、YAMLを指定可能です。 TEXT以外の出力にはTEXT出力と同じ情報が含まれていますが、プログラムによる解析がより容易になります。 このパラメータのデフォルトはTEXTです。

ちなみに出力形式をTEXTとした場合の結果は下記。

f:id:wonder-wall:20170913210309p:plain