
なぜ、SQLの内部処理を理解する必要があるかというと、「SQLチューニング」において遅延原因を分析することが出来るようになるためです。
SQLは、Oracle内で、内部的には下記の流れで処理されます。
- SQLの解析
- SQLの実行
- SQLのフェッチ
SQLの解析
Oracleは、SQLを受け取ると「共有プール」の「ライブラリキャッシュ」に格納して、SQLの構文解析を実施します。
「共有プール」や、「ライブラリキャッシュ」という用語については下記の記事で解説しています。
構文解析でやってること
- 構文が正しいかチェック(コンパイル)
- 対象データを参照する権限が、問い合わせしたユーザーに与えられているかどうかチェックすること。
- 効率が上がるように、SQL書式の再設定をする場合もある。
- ライブラリ・キャッシュ内に同一SQLが残っているかチェックしている。(過去に同じ問い合わせをしてないかチェック)
SQLの実行
実行計画の作成
まずは、SQLを実行する前に、Oracleのオプティマイザが解析済みのSQLに対して、「実行計画」を作成します。
「実行計画」については、下記の記事でも解説しています。
SQLの実行
「バインド変数」が利用されているものに対しては、変数を割り当てて、実行計画を元に、SQLを実行します。
バインド変数とは?
ライブラリ・キャッシュに格納されているSQLを共有して利用する仕組みのことです。
SQL実行時のテーブルへのアクセスする動作の仕組みに関しては、下記の記事で解説しています。
SQLのフェッチ
「フェッチ」は、SQLの結果セットからデータを取得する処理のことです。
フェッチがあるのは、「SELECT文のみ」になり、Java等のプログラム言語で利用されたりします。
結果セットを使用した後は、必ず結果セットをクローズするようにしましょう。
なお、Javaから、JDBCを利用して結果セットをクローズすることに関しては、下記の記事でも解説しています。
ソフトパースとハードパース
ソフトパースの方が解析処理がスキップされる分パフォーマンスが良くなります。なので、SQLを記述する際はハードパースが作られないようなSQLにする必要があります。
ソフトパース
同一SQLが解析されている場合は、キャッシュされている実行計画を利用して実行します。解析処理をスキップできます。
ハードパース
同一SQLが解析されている場合でも解析処理を行います。
この記事へのコメントはありません。