tshizuku03の日記

主にoracleやLinuxコマンドについての記事を載せていきたいと思っています。

Oracle でのSQL処理の流れ

クライアントアプリケーションから発行されたSQLは、サーバープロセスが処理します。

サーバープロセスが行うSQL処理は大きく分けるといかの3つです。

  1. 1.SQL解析
  2. 2.SQL実行
  3. 3.行の取得(SELECTの場合のみ)

1.SQL解析

共有プール確認

↓(共有プールに解析済みSQL情報が存在せず)

SQL検証

実行計画作成

解析済みSQL情報を共有プールへ格納

2.SQL実行

3.データベースバッァファキャッシュのブロックから行を取得

終了

 

共有プールの確認

サーバープロセスは受け取ったSQLと同じSQLの解析結果が共有プールに存在しないか確認。存在した場合は、その解析済みSQL情報を使用することで「SQL検証」と「実行計画の作成」の2つの処理をスキップし、SQLを実行します。(ソフトパース)

 

実行計画作成

SQL検証をパスし、実行可能と判断された有効なSQLに対して、SQLの実行に先立ち「実行計画」を作成します。SQLには具体的な実行手順を指定できない為、Oracleが実効計画を作成して、具体的な実効手順を決定する必要があります。

代表的なアクセスパス

  • テーブルスキャン(TABLE ACCESS FULL):テーブルないの全ての行を読み取る
  • ROWIDスキャン(TABLE ACCESS BY ・・・ROWID):ROWIDを用いて、テーブルから対応する行を読み取る
  • 索引一意スキャン(INDEX UNIQUE SCAN):一意索引から、等価条件に合致した1つの行に対応する1つのROWISを読み取る
  • 索引レンジスキャン(INDEX RANGE SCAN):索引から、範囲条件に合致した1つ以上の行に対応する1つ以上のROWIDを読み取る
Oracleの結合方法
  • ネステッドループ結合(NESTED LOOPS):結合対象のテーブル内のそれぞれの行を総当たりで調べて結合する
  • ハッシュ結合(HASH JOIN):結合対象の列のハッシュ値を利用して結合する
  • ソート/マージ結合(MARGE JOIN):行をソートしてから結合する
 
CBOとオプテイィマイザ統計

 実行計画を作成するのは、サーバープロセスに組み込まれた(CBO(Cost-Based Optimizer:コスト・ベース・オプティマイザ))と呼ばれる処理モジュールです。SQLがアクセスするオブジェクトのオプティマイザ統計をもとに実行計画を作成する。

 Oracle10g以降はディスクI/OとCPUを見積もった評価である。統計情報はテーブルの行数や、行の平均サイズ、索引の有無、Bツリー索引の高さ、列値のばらつき具合など、実際に格納されているデータの状態を集約したさまざまな統計情報のこと。

統計情報はデータディレクショナリに保存される。

 

なお、解析済みSQL情報はSGA内の共有プールに格納されるので、インスタンス停止すると解放されます。また、共有プールはLRUで管理されているので、長い時間使用されていない解析済みSQL情報は、共有プールから消去される場合があります。