SQLの実行計画の決定方法を理解する

サーバーのイメージ画像 データベース

この記事では実行計画の見方を理解する前に、
実行計画がどのようにして決定されるかをざっくり理解する。

クエリ評価エンジンの流れ

そもそもSQLのクエリは、データに対していきなり実行されるわけではなく、
「このクエリをどうやって実行したら最適か?」という計画を立ててから実行される。

大まかな流れは以下の3ステップになる。

  1. パーサ
  2. オプティマイザ
  3. プラン評価

パーサ(役割:構文解析)

ユーザーが入力したクエリを解析し、後続の処理が実行しやすい形式に変換する。

主に以下の2点が実行される

  1. 構文が正しいかどうかのチェック
  2. 後続処理で効率的に実行できるような形式に変換する

オプティマイザ(役割:実行計画の計算)

オプティマイザとは、日本語で言うと「最適化」であり、
その名のとおり一番最適なデータアクセスの方法(実行計画)を決定する。

具体的な手順は以下の通り。

  1. いろいろなパターンの実行計画を作成する
  2. それらの実行コストを計算する

この際、カタログマネージャの情報を利用してコストを計算する。

カタログマネージャ

オプティマイザを実行するためには、
テーブルのレコード数、インデックスの有無、データの散らばり具合などの情報が必要になる。

この情報一覧を格納しておくのがカタログマネージャである。

DBによって細かい違いがあるが、カタログには大抵は以下のような情報が格納されている。

  • 各テーブルのレコード数
  • 各テーブルの列数と列のサイズ
  • 列値のカーディナリティ
  • 列値のヒストグラム(どの値がどれだけ存在するかの分布)
  • 列内にあるnullの数
  • インデックス情報

カタログの情報をしっかり更新していないと、実行計画を作成する際の判断ミスに繋がる。

プラン評価(役割:実行計画の決定)

オプティマイザが計算してくれた実行計画の中から、一番最適な実行計画を選ぶのがプラン評価である。

エンジニアはここで決定された実行計画を読むことによって、
現状のSQLの問題点について理解することができる。

まとめ

  • SQLはむやみに実行されるわけではなく、計画を立ててから実行される
  • 流れは以下の通り
    • 構文チェック
    • クエリ形式の最適化
    • 実行計画をいくつか計算
    • その中から最適な実行計画を選択する
  • 最終的に決定された実行計画を確認することで、SQLのパフォーマンス改善に繋げることができる
タイトルとURLをコピーしました