最終回の第7回では、データベースへの問い合わせ処理を最適化するための機能であるオプティマイザ機能について解説する。

 Oracle Database 12cでは効率性の高い実行計画を作成するために、オプティマイザや統計情報の収集機能が強化されている。オプティマイザの役割はSQL文の構造や統計情報に基づき、選択可能な実行計画の中から最も効率的なものを選択することである。

 しかしながら使用する統計情報が実際のデータの状態と異なる場合には、オプティマイザは不正確な統計情報を使ってコスト(処理に使用するリソース量の見積もりを数値化したもの)の見積もりを行うため、効率の悪い実行計画を選択することがある。そこでOracle Database 12cでは、より正確な統計を使用して実行計画を選択するように機能が強化・追加されている。

 以下、これらの新機能と設定の方法、使用する上での注意事項などについて紹介する。

SQL実行時に実行計画を調整

 Oracle Database 12cから導入された新機能である「適応計画(アダプティブ・プラン)」は、オプティマイザが誤った見積もりから最適ではない実行計画を作成した場合に、実行計画の調整を行う。この際、適応計画はSQL実行時に得た情報に基づく。

 データベース管理者やOracleデータベースの自動統計収集により収集された統計は、データ・ディクショナリに格納される。通常はここに格納された統計を使用して作成された実行計画が、実際に使用する実行計画として採用される。

 一方、適応計画ではこの最初に作成したプランを「デフォルト・プラン」と呼ぶ。そして、このデフォルト・プランが実際に使用する実行計画になるとは限らない。適応計画には、「サブプラン」と呼ばれるSQL実行時に切り替えが可能な実行計画のサブセットを用意する。

 内部処理としては、デフォルト・プランもサブセットの一部として同列に扱う。その上で、SQL実行時に取得する統計情報を使って、このサブプランの中からより適切なものを選択し直すことができるようになっている。採用された最終的な実行計画を「ファイナル・プラン」と呼ぶ。

 適応計画の動作イメージを説明するために、図1のような二つの表を結合するSQL文を実行した場合を考えてみよう。この実行例は、注文一覧(order_items)と商品情報(product_information)の二つの表から、注文一覧における単位価格 (unit_price)が「15」であり、かつ数量(quantity)が1より多い注文の商品名を抽出するというものである。

図1●SQL文の例
図1●SQL文の例

 この例におけるサブプランは、ネステッド・ループ結合とハッシュ結合である。統計情報から決められたデフォルト・プランはネステッド・ループ結合である。SQL実行時の統計収集により、このSQL文で返されるorder_items表からの行数がオプティマイザの考えるしきい値より多いことが判明した場合には、サブプランをハッシュ結合に変更し、これをファイナル・プランとする(図2)。逆に実行時の統計収集で得た値がしきい値を超えなかった場合には、そのままデフォルト・プランで設定されたネステッド・ループ結合がファイナル・プランとなる。

図2●適応計画の機能概要。SQL実行中に結合方式を最適なものに変更する
図2●適応計画の機能概要。SQL実行中に結合方式を最適なものに変更する
[画像のクリックで拡大表示]