データベースがSQLを受け取って処理を実行する前には下記のような段階があります。
パーサー
SQL構文のチェックします。これは一般的なプログラムのチェックと同様かと思います。
オプティマイザ
最適なSQL情報を計画します。同じSQLを実行する場合でも複数の経路があるため、カタログマネージャーを参照し、どの経路が最適化を選択します。
カタログマネージャー
統計情報の照会をします。
統計情報というのは具体的には下記のような情報です。
- 各テーブルのレコード数
- 各テーブルの列数と列のサイズ
- 列値のカーディナリティ
(値の個数) - 列値のデータ分布
(どの値がいくつあるかのヒストグラム) - 列内のNULLの数
- インデックス情報
これらによって最適な経路というのは違ってくるため、これらの情報をオプティマイザに伝えます。
大きいデータがあった時にはこの統計情報を更新する必要があるようですね・・・知らなかった・・
ただ、実際には更新せずに「凍結」という状態にすることもあるようです。
参考リンク
【SQL入門】クエリ(sql)実行後、DBMSでなにが行われているのか
Bアタマアカデミー 第4回 クエリ評価エンジンと実行計画―“シェフおまかせ”はいつも美味しいのか(1)