Oracleデータベースでのオプティマイザと統計情報はSQLの速度を決めるための重要なものです。
オプティマイザと統計情報とは何者なのか、どう使われているかを説明します。
オプティマイザと統計情報
統計情報を語るうえで欠かせないのがオプティマイザです。
オプティマイザの仕事は、SQL文を受け取り、SQL文の中で求められているデータをどのように取得するか、また、どのように取得すれば最も速く取得できるかを決定することです。
SQL文が実行されると、データベースはSQLを実行計画(よくプランと呼ばれます)に変換し、データを取得する最適な方法を選択する必要があります。
この記事の一番上の画像をご覧ください。データを見ながらどれにしよっかな~と考えている人がオプティマイザくんです。
最適な実行計画を選択するためには、テーブルデータの分布やカーディナリティが必要になりますが、これらのテーブルデータではないメタデータのことを統計情報(オプティマイザ統計とも呼ばれます)と呼びます。
Oracleの場合、各SQLにはテーブル行を取得するために使用するインデックス、複数のテーブルを結合する順序、使用する内部結合メソッド(ネステッドループ結合、ハッシュ結合、スター結合、ソートマージ結合メソッドなど)の実行計画の選択肢が多くあります。
これらの実行計画は、一般にCBOとして呼ばれているコストベースオプティマイザによって計算されます。
コストベースオプティマイザとは、統計情報を元に実行計画を決めるオプティマイザのことです。
※Oracle9iまではRBO(ルールベースオプティマイザ)という統計情報を使用せずにルールに沿って実行計画を決めるオプティマイザがありましたが、Oracle10g以降は非推奨となりました。
オプティマイザが決める実行計画の選択は、SQLに対して常に最適な実行計画を選択するために、OracleはSQL内のテーブルとインデックスに関する統計情報を頼りにして決めます。
オプティマイザがテーブルとそのテーブルを取り巻くインデックスの統計情報を使用して実行計画を決め終えると、オプティマイザは実行計画をデータベースに提供します。
実行計画とは、Oracle にどのようにデータを取得するかを指示する命令の集合のようなものです。
オプティマイザに関する私の経験談
Oracle9i, Oracle10g の頃のコストベースオプティマイザははっきり言ってしまうと、なかなか頭が良くなくて「その実行計画違うよ!」と思う最適なプランを選択してくれなかったことが多くあったのですが、11g以降はコストベースオプティマイザがかなり賢くなり、統計情報を適切に取ればほぼすべてのSQLがオプティマイザによって適切な実行計画を選択してくれるようになったと感じています。
とはいえ、自由に書けるSQLに対して適切な実行計画を選択するオプティマイザを開発したオラクルの開発者はかなり苦労したのではないでしょうか。
ルールベースオプティマイザには不可能だったことを可能にしてくれたこと、統計情報を見ながら最適な実行計画を選択するプログラムを開発したことに脱帽です。