Oracleのオプティマイザの最適化のゴールとは?~ソースコードを書いているエンジニアが語る

RDBMS にとってクエリ・オプティマイザは、最も重要なコンポーネントの一つですが、その動作についてはあまり知られておらず、ブラックボックスだと思われている方が多いようです。

このコラムでは、Oracle の開発部門で、オプティマイザのソースコード修正を担当している立場から Oracle Database のオプティマイザの基本動作や機能、歴史について紹介していきます。


オプティマイザ・モードって?

前回の「Oracleのオプティマイザが問い合わせ処理を最適化する方法」では、Oracle Database のオプティマイザの構成要素について見てきました。
今回は前回からの続きで、いったい何をもって「適切」や「最適」と言えるのか、について考えてみたいと思います。

これに答えるにはオプティマイザ・モード(オプティマイザの目標)について考える必要があります。というのは、何が最適かはユーザーが設定する OPTIMIZER_MODE の値に依存するからです。つまり、最適化のゴールはユーザーに決めてもらうことになります。

さて、オプティマイザ・モードについてですが、Oracle Database 10g R1 以降でサポートされている OPTIMIZER_MODE の値は以下の3種類です。

1. ALL_ROWS

CBO(Cost Based Optimizer) を使用し、スループットが最大になるような実行計画を立てます。つまり、統計情報に基づき、SQL文を満たす全ての行を最小のリソースで返すことを目標に実行計画を立てます。

2. FIRST_ROWS_n

CBO(Cost Based Optimizer) を使用し、n行を返すまでのレスポンスタイムが最短になるような実行計画を立てます。こちらも ALL_ROWS と同様、統計情報に基づき、SQL文を満たすn行を最速で返すことを目標に実行計画を立てます。

3. FIRST_ROW

下位互換性(Backward Compatibility)と Plan Stability のために残されているものです。FIRST_ROWS_n の使用が推奨されています。

上記1,2では CBO(Cost Based Optimizer) の使用が前提となっています。これは、オプティマイザが、統計情報から表へのアクセスや表の結合にかかるI/OやCPUのコストを見積もり、OPTIMIZER_MODE で設定された目標に最適な(コストが低い)アクセス方法や結合順序・結合方法を選択していくことを意味しています。

なお、Query Transformation(問合せの変換)に関しては、全てが Cost Based で行われるわけではありません。その理由としては、前回例として挙げた Transitive Predicate Generation のように変換した方が良いことが、経験則から分かっている変換があること、変換のバリエーションがたくさんあり全てのパターンを試していると最適化に時間がかかり過ぎてしまう場合があることなどがあります。
※補足:Cose Based Optimizer(CBO) と Cose Based Query Transformation(CBQT) の関係については、また別の機会に述べたいと思います

いずれにしても、CBO では統計情報から計算したコストを基に、何が最適かを判断していることになります。ということは、統計情報が正しくなかったり、物理的な記憶域の特性やデータ特性を正しく表現できなかった場合、オプティマイザは正しい判断ができず、最適ではない実行計画を立ててしまいます。
そういう意味では オプティマイザは統計情報に対してとても従順です。常に統計情報は正しいと思って(仮定して)実行計画を立ててしまうのですから...

ところで、Oracle 9i Database R2 までは Rule Based Optimzier(RBO) がサポートされていました。
Oracle Database 10g R1 で RBO がサポートされなくなってから、しばしば「RBO の方が良かったのに」とか「CBO になったら遅くなった」とか「なぜ RBO がサポートされなくなったの?」といった声を聞くことがあります。
では、なぜ Oracle Database 10g R1 以降、RBO はサポートされなくなったのでしょうか?

これについて説明するためには、Oracle Database の進化の歴史を振り返ってみる必要があります。
ということで、次回は Oracle Database の進化を振り返りつつ、RBO がサポートされなくなった理由について説明していきたいと思います。

Oracle Database のソースコードを書いているエンジニアが語る "Oracle のオプティマイザ"

日本オラクル株式会社 Sustaining Engineering
真下 哲(ましも さとし)

製品のソースコード修正を担当する Sustaining Engineering 部門において、オプティマイザを担当する立場から、Oracle Database のコア機能であるオプティマイザについて語ります。

Comments:

Post a Comment:
Comments are closed for this entry.
About

Oracleエンジニアの方がスキルアップしていただくために、厳選した情報をお届けしています

Search

Archives
« 4月 2014
  
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   
       
Today
Bookmarks
関連サイト
ランキング:カテゴリ
ランキング:技術資料
ランキング:技術コラム