プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • Oracle
  • 【Oracle】オプティマイザとは?
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【Oracle】オプティマイザとは?

05.03

  • miyabisan2
  • コメントを書く

この記事は2分で読めます

Oracleには、SQLの実行処理時に、実行計画を作成してくれます。

オプティマイザにも下記の2種類が存在します。

  • CBO
  • RBO

CBO(コストベース・オプティマイザ)

テーブル、列、索引等の統計情報を使用して、最適な実行計画を立てていく方式です。

メリット

データの件数の偏りに左右されず、最適な実行計画を立てることができる。

デメリット

データ件数が一気に増減した場合に、最適な実行計画を立てずに古い実行計画のまま実行してしまうと、突然パフォーマンスが低下する可能性がある点。

RBO(ルールベース・オプティマイザ)

※Oracle10g以降はサポート対象外になっています。基本は、CBOを使います。

あらかじめ決められたルールを元に実行計画を作成する方式です。(例えば、検索条件として指定された列に、索引が作成されているか確認し、その索引を利用する等)

メリット

データの増減に左右されず、安定した実行計画を作成することができる点。

デメリット

データの偏り(件数等)によって、もっと最適なSQLを作成できるのにも関わらずできない点。

Oracleの新機能に対応できていない点(RBOが10g以降サポート対象外になったのは、この理由も大きいみたいです。)

オプティマイザの設定方法

該当のOracleDBが、どのオプティマイザを使用するかは下記の「初期化パラメータ」で設定します。

1
ALTER SESSION SET OPTIMIZER_MODE = "設定値"

設定値の種類

設定値 説明
CHOOSE デフォルト値、SQLの該当テーブルに、一つでも統計情報があればCBO、なければRBOを使う。
RULE RBO固定
FIRST_ROWS CBO固定、最初の1行の応答時間を最小に抑える実行計画とする。
FIRST_ROWS_n CBO固定、最初のN行の応答時間を最小に抑える実行計画とする。
ALL_ROWS CBO固定、全体の処理時間を最小に抑える実行計画とする。

カタログマネージャとは?

オプティマイザが実行計画を立てる際にオプティマイザに重要な情報を提供します。

カタログとは?

DBMSの内部情報を集めたテーブル群になります。このカタログの情報を「統計情報」と呼んだりもします。

統計情報とは?

カタログマネージャが管理している情報です。これらの情報を利用してオプティマイザは実行計画を作成します。

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

統計情報の更新について

適切な実行計画を作成するには統計情報を更新することが重要です。

対象のテーブルやインデックスのサイズと数によっては数十分〜数時間要することもあります。

各DBMSごとに統計情報更新用のコマンドが用意されています。

JIT(Just In Time)について

クエリ実行時に統計情報をリアルタイムに収集するDBMSのことです。メリットばかりのようですが、統計情報の取得自体に数十分とかかる場合があるのでメリットばかりではないです。

スポンサーリンク
  • 2018 05.03
  • miyabisan2
  • コメントを書く
  • Oracle
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2018 04.22

    【Java】PreparedStatementによるINSERT文の実行

  2. 2018 05.05

    【SQL】パフォーマンスを考えるに当たり必要な「結合」の知識(Oracle)

  3. 2018 05.20

    【PL/SQL】条件分岐

  4. 2018 05.20

    【PL/SQL】「変数」や「固定値」の使い方

  5. 2018 04.27

    【Oracle】接続方法の基礎知識

  6. 2018 05.23

    【Oracleアーキテクチャ】「ユーザー」と「スキーマ」について

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【Java】Javaプログラマーなら知らないと今後が危…

【Oracle】実行計画作成後のSQL実行時の動作の仕…

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー