PostgreSQL実行計画可視化ツールおすすめ

# TL;DR

- 無料、情報量、UXから、以下をおすすめ
- pev2(explain.dalibo.com)
    - pev(tatiyants.com/pev/)ベースに奇麗で見やすく使いやすい
- Depesz EXPLAIN(explain.depesz.com)
    - 実行計画のテキスト出力ベースで見れる
- pev(tatiyants.com/pev/)
    - 一覧の情報はまあまあ。各ノードをクリックすると表示される情報量が多め
- 1番他人におすすめできるのはpev2(explain.dalibo.com) 個人的に好きなのはpev(tatiyants.com/pev/)

# 情報入手元

https://wiki.postgresql.org/wiki/Using_EXPLAIN

以下が紹介されてます

- pev2(explain.dalibo.com)
- explain.depesz.com
- pgMustard
- explain-postgresql.com

# pev2(explain.dalibo.com)

https://explain.dalibo.com/

オープンソースのPostgres Explain Visualizer 2(https://github.com/dalibo/pev2 )のWEBホスティングです

サイト下部に記載のあるとおり、```EXPLAIN (ANALYZE, COSTS, VERBOSE, BUFFERS, FORMAT JSON)```したSQLと実行計画を投入します(実行計画貼るときにヘッダーも気にせず貼っちゃいます)。

補足: 

- JSONでなくTEXT形式(フォーマット未指定時デフォルト)でも大丈夫です & SQL貼らず実行計画だけでも大丈夫です
- 他のサイトも同様です。ただしpev(tatiyants.com/pev/)のみ、正しいJSONしか受け付けませんでした

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620712/79211479-d824-8517-15d8-ce93949b0f45.png)

こんな感じで出力されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620712/84e283f1-4993-3bb7-6cf4-95dcd125d401.png)

左ペインで初期値でIOが選択されています。Read/Writeで色分けしてくれそうに見えますがされてません。これはtrack_io_timingが無効(デフォルト)で実行計画にioとbufferの情報が含まれていないためです。
track_io_timingパラメータを有効化し、BUFFERSを指定した実行計画を貼れば表示されると思いますが、track_io_timingを有効化すると高負荷の原因になるため要注意です(以下リファレンスより)。

> このパラメータはデフォルトで無効になっています。その理由は、現時点の時刻をオペレーティングシステムに繰り返し問い合わせるので、プラットフォームによっては深刻な負荷の原因になります。

ノード(要素)ごとのtime, rows, costなどは確認でき有用です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620712/3f177eb5-382b-743d-0639-0a69bcfe6a33.png)

右ペインで、緑や赤のバーが延びているのはcostです。costが一番高いものが赤、次いで黄色(この実行計画にはありません)、次いで緑となります。
各ノードをつなぐ線の太さが異なりますが、太いものがtime(実行時間)が長い部分になっています。
各ノードをクリックすると詳細が表示されます。
(ここでもIO(IO & Buffersのタブ)は見れません)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620712/10d79f26-a621-4d2d-621a-83cdd0f2d1d7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620712/ee9be1c6-5d5c-8ee6-692f-0c5be50cac9d.png)

色々試してると、timeが大きいからといってrows/costsが大きいというわけでもなかったり、けっこう一致しないもんだなと、ちょっとした知見になります。

こちらのURLにアクセスすると私の突っ込んだ実行計画見れるのでお試しください^^: https://explain.dalibo.com/plan/f64da0af59128e61#plan/node/1
(どのくらいの期間保存されてるのかは不明です)

# Depesz EXPLAIN(explain.depesz.com)

https://explain.depesz.com/

SQLと実行計画を投入します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620712/18f1458a-c70b-778f-be49-5f8665b0856b.png)

元々の実行計画の出力ベースで、時間がかかっている部分(exclusive/inclusive)や行数の大きいものが見やすくなっています。
exclusive=そのノード単体の実行時間
inclusive=サブノード込みの実行時間

これはこれでありです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620712/1b91822f-b232-1173-5f48-f1a64dd770be.png)

statsタブも有用です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620712/3d58e994-29e9-5c65-755e-a34e6eb907d7.png)

私の投入した実行計画はこちらで試せます: https://explain.depesz.com/s/y6VV#html

# pgMustard

https://www.pgmustard.com/

有料(無料トライアルあり)

無料トライアル登録しようと思いましたが(Github/Googleでのサインイン)、提供されてるサンプルで使用感は確認できたので登録しませんでした。~~プライバシーポリシーでGoogleアカウントの情報が幾つか抜かれると書いてあってひよりました~~

データ量多いのと(細かく見れる)、実行状況を文章で説明してくれるのがたすかります(英語なのでEdgeで選択範囲を翻訳)
これ見ちゃうと、無料で利用可能な他のサイトがシンプルに見えます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620712/669e756a-a9df-32e1-0fd3-6e7dc2e5bf6c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620712/4234184d-659a-48aa-fb39-72c554421609.png)

サンプルサイトこちらです: 
- https://app.pgmustard.com/#/explore/example-1 
- https://app.pgmustard.com/#/explore/example-2

あちこちさわると色々反応があります(詳細が表示される) 

# Explain PostgreSQL(explain-postgresql.com)

https://explain-postgresql.com/

同じようにSQLと実行計画を投入します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620712/d2bdbff4-a30a-80cb-9205-2868d9b977d8.png)

バーで時間のかかってる演算子が分かりやすいです(ブラウザのデベロッパーツールのtimelineっぽいと思いました)
元々の実行計画ベースなとことか出力項目的に、explain.depesz.comに使用感は近いと思いました。色がポップでこちらの方がフレンドリーな感じはあります。まず実行時間/行数の大きいものから見ていくときには使いやすそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620712/c73d32fd-e6ed-fa74-0bfc-e65040a54193.png)

各ノードをクリックすると詳細が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620712/55671ae4-57bd-7b8f-3809-a03842651111.png)

演算子が赤字でリンクになっていて、クリックするとそのノードの解説動画(youtube)に遷移しました。外国語のため理解できませんが、ユーザーフレンドリーな精神は伝わってきます

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620712/74eb0d48-326e-0ddd-fc05-cbc761f71d54.png)

diagramタブをクリックするとアイコンで表示されます。アイコンをカーソルオーバーすると詳細が表示され、クリックするとexplainタブの該当のノードに遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620712/ff3a60d0-5220-175b-95ac-d019beeb82c5.png)

relationsタブはローディングのまま数分待っても表示されませんでした。外部制約のリレーション図を表示してくれるのではと思います

wiki.postgresql.orgに紹介されていたものは以上で、それ以外に見かけたものを載せていきます

# Postgres Explain Visualizer

pev(tatiyants.com/pev/)と同名だけど関係性は不明
https://www.pgexplain.dev/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620712/9a57545e-225e-a214-0813-0b18a5992269.png)

使用感や内容はシンプルです
pev2(explain.dalibo.com)と雰囲気感近いですが、次にのせてるpev(tatiyants.com/pev/)やpev2(explain.dalibo.com)より項目が少ないのと、マウスでのズームやドラッグ&ドロップに対応してません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620712/9f6b1fe3-78a3-ece0-7c50-5ef394de6a30.png)

私の投入した実行計画はこちらで試せます: https://www.pgexplain.dev/plan/08266476-636c-48b4-9ade-517eee766f3b#plan

# pev(tatiyants.com/pev/)

https://tatiyants.com/pev/

オープンソースのPostgres EXPLAIN Visualizer(https://github.com/AlexTatiyants/pev )のWEBホスティングです

厳密なjsonでないと受け付けないため、以下コマンドで出力したものを利用しました
(ここまでは、余計なヘッダーや```+```が含まれたものでも動いてたので気にしてませんでした)

```
psql -h localhost -d qiita -U qiita -qAt -f explain.sql > analyze.json
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620712/bac28c26-1704-2c6b-8764-02b384746ec6.png)

見た目まあまあ良いなあと思います
一番時間がかかってる部分はslowest, 取得レコード数が多い部分はlargesetなど表示されていて見やすいです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620712/1d0cd1e6-4d7f-8644-ded0-7f6480a35402.png)

ノードをクリックすると、詳細なデータががっと表示され、強力に思いました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620712/3a16d653-2fa7-9c39-19ed-3e7cc2d3012a.png)

情報量多いし見やすい。良いかもです。

こちらのサイトは、私の投入した実行計画をURL共有できませんでした

# dbForge Studio for PostgreSQL

有償ですが、express editionは無料利用可能です(機能一覧表上で、express edtionでも色々な機能に対応してました)

https://www.devart.com/dbforge/postgresql/studio/query-profiling.html

業務アプリっぽいUIだと思いました。サンプル画面でなんとなく雰囲気掴めたので試してません。

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620712/681c2485-b361-329d-d828-222cde89dc2a.png)

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620712/5cbb5545-ea7b-da78-732e-dc4d190b7ff2.png)

# gocmdpev

こちらのサイトで紹介されていました: https://wonderwall.hatenablog.com/entry/2017/09/13/220000
CUIベースです。

https://github.com/simon-engledew/gocmdpev

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620712/126fec2b-3bf7-f413-d81c-6d4c96847e4b.png)

# その他

pevの派生の流れが面白いです
- Alex Tatiyantsさんがpevを作り(https://github.com/AlexTatiyants/pev )、WEBホスティング(https://tatiyants.com/pev/ )
- pevが数年メンテされてないのをきっかけにpgiraudさんがpevをリスペクトしてpev2を作り(https://github.com/dalibo/pev2 )、dalibo社のドメインでWEBホスティング(https://explain.dalibo.com/ )