この記事では実行計画の見方を理解する前に、
実行計画がどのようにして決定されるかをざっくり理解する。
クエリ評価エンジンの流れ
そもそもSQLのクエリは、データに対していきなり実行されるわけではなく、
「このクエリをどうやって実行したら最適か?」という計画を立ててから実行される。
大まかな流れは以下の3ステップになる。
- パーサ
- オプティマイザ
- プラン評価
パーサ(役割:構文解析)
ユーザーが入力したクエリを解析し、後続の処理が実行しやすい形式に変換する。
主に以下の2点が実行される
- 構文が正しいかどうかのチェック
- 後続処理で効率的に実行できるような形式に変換する
オプティマイザ(役割:実行計画の計算)
オプティマイザとは、日本語で言うと「最適化」であり、
その名のとおり一番最適なデータアクセスの方法(実行計画)を決定する。
具体的な手順は以下の通り。
- いろいろなパターンの実行計画を作成する
- それらの実行コストを計算する
この際、カタログマネージャの情報を利用してコストを計算する。
カタログマネージャ
オプティマイザを実行するためには、
テーブルのレコード数、インデックスの有無、データの散らばり具合などの情報が必要になる。
この情報一覧を格納しておくのがカタログマネージャである。
DBによって細かい違いがあるが、カタログには大抵は以下のような情報が格納されている。
- 各テーブルのレコード数
- 各テーブルの列数と列のサイズ
- 列値のカーディナリティ
- 列値のヒストグラム(どの値がどれだけ存在するかの分布)
- 列内にあるnullの数
- インデックス情報
カタログの情報をしっかり更新していないと、実行計画を作成する際の判断ミスに繋がる。
プラン評価(役割:実行計画の決定)
オプティマイザが計算してくれた実行計画の中から、一番最適な実行計画を選ぶのがプラン評価である。
エンジニアはここで決定された実行計画を読むことによって、
現状のSQLの問題点について理解することができる。
まとめ
- SQLはむやみに実行されるわけではなく、計画を立ててから実行される
- 流れは以下の通り
- 構文チェック
- クエリ形式の最適化
- 実行計画をいくつか計算
- その中から最適な実行計画を選択する
- 最終的に決定された実行計画を確認することで、SQLのパフォーマンス改善に繋げることができる