【DBウィーク6日目】Oracle Database オプティマイザとは | 若手エンジニアのブログ

若手エンジニアのブログ

文系出身の若手女子エンジニアによる技術ブログ。
日々の経験や学びをアウトプットするためにブログを書いています。
バックエンド(Java+SpringFramework)を経てインフラエンジニアになりました。
今は育休中につき、本で勉強したことを中心にアウトプットしています。

今日は、昨日予告していた通り、Oracleのオプティマイザについて勉強していきます。

 

もくじ

1.イメージ

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

3.オプティマイザはコストベースで実行計画を判断する

 

オプティマイザとは、あらゆるSQL文の処理に不可欠な機能であり、
所定の問い合わせ構造に基づいて、各SQLに最も効率的な実行計画を決めてくれる。
 

1.イメージ

オプティマイザとか実行計画とか言われても、よく分からないので、まずはざっくりとしたイメージから。

 

私の出身である、京都の宇治市(お抹茶と、10円玉の裏にかかれた平等院で有名なとこ)が、個人的にイメージしやすいかったので、

京都~宇治の電車路線で例えてみたい。

きっと皆さん観光でいらっしゃるはずなので、京都~宇治の電車を利用することもあると思う。

(ぜひ来てたくさんお金落としてください)

 

さて、京都駅から、宇治方面への電車は、3通りある。

 ①JR奈良線

 ②私鉄1(京阪)

 ③私鉄2(近鉄)

 

ではどの電車を使うのが良いのか?

京都駅から観光にやってくる想定で、比較してみたい。(値段や時間は2021年5月4日現在)

 

路線 乗車駅 下車駅 値段 時間 長所 短所
JR奈良線 京都駅 宇治駅 240円 約25分 京都→宇治という分かりやすい行き方。
値段も安い。
有名な?宇治橋&宇治川の流れを電車から一望できる。
悪名高い遅延魔。
かつ、3路線で一番本数が少ない。
さらに車両数も一番少ないため、
車内が観光客であふれかえっており、
通勤ラッシュなみの混雑を覚悟する必要。
私鉄1(京阪) 徒歩→七条駅 京阪宇治駅 310円 約50分 京阪宇治駅または手前の駅が
観光スポットから一番近い駅であり、
宇治到着後は観光スポットを回りやすい。

3路線で一番京都っぽい電車なので
京都に来た感が味わえる(筆者主観)
京都駅は通っていない。
従って乗車には、
京都駅から歩いて約20分かかる京阪の駅(七条)まで行くか、
JRまたは近鉄で途中まで行って乗り換える必要がある。
さらに別途、途中で京阪本線→京阪宇治線に乗り換えも必須。
私鉄2(近鉄) 京都駅 向島、小倉、
伊勢田、
大久保など…
300円
約25分※ 京都駅から乗ることができる。
近鉄の京都駅構内はお店が充実し、
それだけでミニ観光スポットと言える。
なぜか赤福(三重県名物)も買える。
宇治市内の観光スポットからは離れた
住宅地に降り立つことになる。

※降車駅によって多少変動。

 

 

初めて京都に来て、迷ったり余計に歩いたりするのを避け、王道の道を行きたいという観光客であれば、

JRが値段も安く、比較的無難でおすすめである。

 

また乗り換えは平気という観光客なら、徒歩または他路線との乗り換えも厭わず、

各観光スポットに最も近い、私鉄1(京阪)を選ぶのも良い。

 

逆に私のような地元民が実家に帰省するのなら、

乗り換えに慣れていたり、観光スポットの近くである必要はないといった事情があるので、私鉄2(近鉄)を選ぶこともある。

 

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

電車の例で言いたかったのは、

観光ならJRか京阪がおすすめだよ!ぜひ宇治に来てね! ということではなく、

電車の複数の路線と、それら路線の詳細情報を踏まえて、どの路線がいいかを提示する人(このブログの筆者)が、

Oracleの実行計画と、オプティマイザに似ているということ。

 

Oracleの実行計画とは、あるSQL文の実行手順のことである。

電車において、「京都駅から宇治方面にいく」という結果を得るために、複数の行き方があることと同様に、

実行計画も、同等のSQL実行結果を得るために、実行手順が複数あることが多い。

 

また、オプティマイザとは、SQLの様々な実行計画をつくったうえで、

「どの計画の実行にどれくらいコストがかかるか」をもとに、最も状況に適している(コスト低く実行できる)計画を選ぶ役割を持つ。

電車において、各路線の詳細情報を整理して、最も良いと思われる行き方を選択・提示した、筆者の役割と似ていると言える。

 

 

3.オプティマイザはコストベースで実行計画を判断する

ここまでで見てきた通り、オプティマイザは、SQL実行をどのように行うかを決めるための、

とても大事な役割を担っていることがわかる。

そしてその決定には、コストベースで判断しているということも、重要なポイントである。

 

コストベースで判断しているということは、突き詰めると、以下のようなことも頭に入れておく必要がある。

 

 ①コストベースで判断するためには、実際にどんなコストがかかるか、情報を知っている必要がある

    (電車であれば、運賃や、駅の場所、所要時間などの情報を知らないと、どれが良いか判断できない)

 ②コストベースで判断するため、結果として必ずしも最適にならないことがある

    (電車であれば、最小コストの路線を選んだはずが、電車が運休して迂回する必要があり、結果として運賃も時間も余計にかかった、などがありうる)

 

特に①について、オプティマイザがより適切な情報から判断できるようにするため、

Oracleでは、統計というしくみが整っている。

 

例えばテーブルの全レコード数やインデックス情報、データの分布、null数などなど、

判断根拠となるデータをひっくるめて、統計情報と呼び、

オプティマイザの判断に役立てられるよう、データベースで、これら統計情報を取得するようになっているのである。

 

 

 

おわりに。

GW休暇の謎なノリで宇治を宣伝しましたが←

静かで落ち着いていて、お茶がおいしいので、コロナが落ち着いたらぜひ行ってみてください。

抹茶のお菓子が有名ですが(そしてもちろん美味しいのですが)、

個人的には抹茶よりも、玉露をぜひ味わっていただきたい。

 

 

今日はあんまり突っ込んだところまで勉強できてない気もするけど、

本を読みたい気分なのでこのあたりで。