skillup

技術ブログ

Database

オプティマイザと実行計画

投稿日:2016年7月28日 更新日:

データベースがSQLを受け取って処理を実行する前には下記のような段階があります。

パーサー

SQL構文のチェックします。これは一般的なプログラムのチェックと同様かと思います。

オプティマイザ

最適なSQL情報を計画します。同じSQLを実行する場合でも複数の経路があるため、カタログマネージャーを参照し、どの経路が最適化を選択します。

カタログマネージャー

統計情報の照会をします。

統計情報というのは具体的には下記のような情報です。

  • 各テーブルのレコード数
  • 各テーブルの列数と列のサイズ
  • 列値のカーディナリティ(値の個数)
  • 列値のデータ分布(どの値がいくつあるかのヒストグラム)
  • 列内のNULLの数
  • インデックス情報

これらによって最適な経路というのは違ってくるため、これらの情報をオプティマイザに伝えます。

大きいデータがあった時にはこの統計情報を更新する必要があるようですね・・・知らなかった・・

ただ、実際には更新せずに「凍結」という状態にすることもあるようです。

参考リンク

【SQL入門】クエリ(sql)実行後、DBMSでなにが行われているのか
Bアタマアカデミー 第4回 クエリ評価エンジンと実行計画―“シェフおまかせ”はいつも美味しいのか(1)

-Database
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

アンチパターン バインド変数の未使用+直積組み合わせ+データ量爆発+インデックス関連

本日はSQLコーディングに関して。 ここら辺は実際にプログラムを書く際に重要になってくるネタ。 Contents1 バインド変数1.1 デメリット1.2 対策2 直積により組み合わせが爆発する2.1 …

no image

JPQLでの算術関数

複雑なJPQLを書いていると、通常のレコードの取り出しだけではなく、合計(SUM)や算出(COUNT)などのいわゆる算術関数を使うことが一般的です。 JPQLでもこれらを通常通り扱うことができます。 …

no image

HAVING句について NULL時の動き

HAVING句のNULLがあった時の挙動にたいしてメモリます。 COUNTの処理 対象上の列数を数えるのにCOUNTを使うと思いますが、COUNT(*)とCOUNT(列名)では動きが若干違っており、前 …

no image

データベースアンチパターン・グレーパターンまとめ

本で勉強したものと自分で個人的に経験したことのまとめ Contents1 値渡しと参照渡しの混同2 型の制約が弱い3 変更していいデータ、していけないデータ4 参照系と履歴系のデータを区別する5 リレ …

no image

SQLにおけるナンバリング

本日はナンバリングに関して。 MySQLを使っていますと各テーブルにはid int not null auto_increment primary keyなどと打って主キーを打つことがほぼ習慣になって …

アーカイブ