実行計画の見方（postgresql）

#####目的
データサイエンティスト協会が行っている腕試しツール
「スキルチェックリスト」の1項目
<font color="Red">【記述したSQLの実行計画の確認と判断ができ、
SQLの修正やインデックス作成により、
処理時間を大幅に改善するようなパフォーマンスチューニングができる】</font>
ができるようになること

---
#####目的
・記述したSQLの実行計画の確認と判断ができ
→<font color="Red">実行計画の見方がわかるようになる</font>

・SQLの修正やインデックス作成により、
処理時間を大幅に改善するようなパフォーマンスチューニングができる
→<font color="Red">パフォーマンスチューニング</font>

---
#####目的
細かいところまで覚えきれない...

まずは大まかな見方、チューニングの一例を覚えて浅く広く理解を
↓
知識が必要になったときに詳細を参考サイト等で確認し深い理解を

→何を調べればいいのかがわかるようになるまでを目的とする

---
#####目次
・実行計画って何ぞ
・実行計画の見方
・パフォーマンスチューニング（一例）

---
#####目次
・<font color="Red">実行計画って何ぞ</font>
・実行計画の見方
・パフォーマンスチューニング（一例）

---
#####実行計画って何ぞ
実行計画　→　<font color="Red">処理の実行順の計画</font>

テーブルからデータとってきて、
次にデータ結合して、
次にデータ並び替えて
　　　　　　　・・・みたいなイメージ

---
#####実行計画って何ぞ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279857/6c086760-9bc4-18f6-9a4b-2919e2ad72d8.png)


---
#####目次
・実行計画って何ぞ
・<font color="Red">実行計画の見方</font>
・パフォーマンスチューニング（一例）

---
#####コマンド
[EXPLAIN](https://www.postgresql.jp/document/12/html/sql-explain.html)→プランナが導いたデータ取得方法や結合方法（クエリプラン）を表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279857/ecd92666-ae68-17a3-c193-529db6ea8c52.png)

---
#####実行計画の見方（実行順）

---
#####実行計画の見方（実行順）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279857/17249d46-31e1-0e74-039d-bd4d6af09fb6.png)


---
#####実行計画の見方（実行順）
・ネストが深いものを優先（右→左）
・ネストが同じ深さ→上を優先（上→下）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279857/35203d3d-6c55-2c89-feb0-b73fcce933c9.png)


---
#####実行計画の見方（各値）

---
#####実行計画の見方（各値）
演算子：各ノード（処理）がどのような処理を行っているかわかる
　コストがかかりやすい演算子、かかりにくい演算子がある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279857/f8754750-a580-fca5-af00-353c05dd274e.png)
[演算子のわかりやすい資料①](https://lets.postgresql.jp/sites/default/files/2016-11/Explaining_Explain_ja.pdf)
[演算子のわかりやすい資料②](https://www.slideshare.net/MikiShimogai/postgre-sql-explain)

---
#####実行計画の見方（各値）
cost：処理の重さの指標。数が大きいほど処理が重い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279857/7f22cc35-b32c-d44b-e67f-25d12e9d9fc5.png)

---
#####実行計画の見方（各値）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279857/cb3366f9-ee28-6364-1c30-df728c267f4f.png)

---
#####実行計画の見方（各値）
rows：処理が行われる対象の行数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279857/c503f919-9485-318b-df7f-eb9210e3eacc.png)



---
#####実行計画の見方（各値）
width：データ型サイズ。それほど重要ではないので説明割愛

---
#####実行計画の見方（まとめ）
・実行計画→処理の実行順の計画
・EXPLAIN
・実行計画の実行順
・演算子,cost,rows


---
#####目次
・実行計画って何ぞ
・実行計画の見方
・<font color="Red">パフォーマンスチューニング（一例）</font>

---
#####チューニングの流れ
①重そうな処理（怪しい箇所）を見つける

②怪しい箇所、関連個所を詳しく見る、修正する

---
#####重そうな処理を（怪しい箇所）見つける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279857/1a193550-364a-3e0c-6690-67fe4094e769.png)




---
#####パフォーマンスチューニング
様々な方法があるが一部紹介



---
#####パフォーマンスチューニング
→「VACUUM」「ANALIZE」を実行する

・[ANALIZE](https://www.postgresql.jp/document/12/html/sql-analyze.html)→テーブルの内容の統計情報を収集。プランナが効率のいい実行計画を決定する際に使用される。
・[VACUUM](https://www.postgresql.jp/document/12/html/sql-vacuum.html)→データベースの不要領域の回収とデータベースの解析（オプション）を行う

---
#####パフォーマンスチューニング
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279857/93bae6ca-4d00-ff9c-a4f4-fee7da1aa762.png)


---
#####パフォーマンスチューニング
rowsの値が実際の値と大きくかけ離れている

→統計情報が古くなっている可能性がある
→コマンド「ANALIZE」や「VACUUM」を実行するべきサイン


---
#####パフォーマンスチューニング
・costが大きい処理に関連するクエリを変えてみる
例①：結合系の処理でcostが大きくなっている
　→結合部分のクエリを変更する（結合方法を変えてみる）など

---
#####パフォーマンスチューニング
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279857/d8c3cd70-eb49-2a81-90a7-d36733bcd6f4.png)


---
#####パフォーマンスチューニング
・コストがかかりにくい演算子が選択されるようにインデックスを張る

インデックス＝索引。データの検索が早くなる場合がある

---
#####パフォーマンスチューニング
例、
　①すべて表をスキャンするSeq Scan演算子が使われていた
　②インデックスを張ってみる
　③インデックスを参考にスキャンするIndex Scan演算子が使われコストが低くなる可能性あり

---
#####パフォーマンスチューニング
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279857/1b0aa596-5be8-787d-a601-3983ce0f1ec4.png)


---
#####全体まとめ
・実行計画の見方を覚えよう
・実行計画の前に「ANALIZE」や「VACUUM」してみる
・実行計画から怪しい箇所を見つけよう
・怪しい箇所を修正してみよう

---
#####全体まとめ
・今回行ったチューニング方法がすべてではない
（調べてみて！！）

・わからないことがあったらまず[公式サイト](https://www.postgresql.jp/document/12/html/index.html)を見よう（絶対正しい情報だから）

---
#####参考サイト
[実行計画の見方、演算子①](https://lets.postgresql.jp/sites/default/files/2016-11/Explaining_Explain_ja.pdf)
[実行計画の見方、演算子①](https://www.slideshare.net/MikiShimogai/postgre-sql-explain)
[実行計画実行順](https://taityo-diary.hatenablog.jp/entry/2018/05/06/230233)
[公式サイト](https://www.postgresql.jp/document/12/html/index.html)
[EXPLAIN](https://www.postgresql.jp/document/12/html/sql-explain.html)
[VACUUM](https://www.postgresql.jp/document/12/html/sql-vacuum.html)
[ANALIZE](https://www.postgresql.jp/document/12/html/sql-analyze.html)