skillup

技術ブログ

Database

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

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

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

パーサー

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

オプティマイザ

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

カタログマネージャー

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

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

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

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

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

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

参考リンク

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

-Database
-

執筆者:


comment

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

関連記事

no image

MySQL safe mode

MySQLに関してしっかりパスワードをチェックしていれば問題ありませんが、中にはrootパスワードをわすれた!なんてこともあるでしょう。 そんなときはsafe modeで実行することでrootのパスワ …

no image

DBUtils活用

普段はJavaEEで開発を行っているのでデータベースへのアクセスはJPAを活用しています。 ただ、JavaEE環境だとglassfish経由でデータベースを動かしているので、glassfishを動かさ …

no image

CASE+HAVING句

今回はCASEとHAVINGを組み合わせて、そこそこの難問を解いていきます。 まず下記のようなテーブル(testresults)があるとします。 student | class | sex | sco …

no image

MySQLのユーザー変更+information_schema.columns

MySQLで行うユーザーの作成について

これですが、一つのデータベースに対して行うとhost内のユーザーすべてが切り替わってしまいます …

no image

MySQLでの日付関数

MySQLでSUMやCOUNTなんかはよく使うと思うのですが、日付の関数なんかもかなり使います。 今回は、日付の日数をとりたいときの関数を紹介。 例えばあるカラムにある日付が入力されており、現在との日 …

アーカイブ