skillup

技術ブログ

Database

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

投稿日:

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

パーサー

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

オプティマイザ

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

カタログマネージャー

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

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

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

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

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

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

テーブルからデータの取得

最適と思われる実行計画にのっとり、データを取得する。

流れでいうと1→(2⇔3)→4となるようです。

参考リンク

http://forse.hatenablog.com/entry/2014/04/11/084454
http://gihyo.jp/dev/serial/01/db-academy/000401

-Database
-

執筆者:


comment

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

関連記事

no image

CakePHPでの数字カンマ区切り&PHP&MySQL曜日の出力

今回は主に時間やお金の表示など、出力に関するネタです。 Contents1 Cakeでのカンマ区切り1.1 単純なカンマ区切り 例1,0001.2 \をつけるケース 例 \1,0001.3 円をつける …

no image

JPQLでの算術関数

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

no image

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

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

no image

MySQLのSETとFIND_IN_SETについて

MySQLの方ですが、単純な文字列や、数字、日付の他に配列に近いSET型、また5.7以降ではJSONなどを入れることができます。 Contents1 SET型2 FIND_IN_SET SET型 いわ …

no image

MySQL.sockファイルに関して

朝出社してテストサーバーを見るといきなりサーバーが動いていないという事態が発生。 MySQLを起動しようとすると

なるメッセージがでて …