アットウィキロゴ

5-3SQL実行時の内部動作

SELECT文の動作

SELECT文を実行したときはOracleサーバーでは以下のような処理が行われている。
①ユーザープロセスはサーバープロセスにSELECT文を送信する。
②サーバープロセスが、送信されたSELECT文を解析する。解析では以下のような処理が行われる。
  • SQL文の構文チェック
  • SQL文で使用する表や列が存在するかのチェック
  • SQL文がアクセスする表や列へのアクセス権限をユーザーが持っているかのチェック
  • これらをチェックする際に利用した表データ(データディクショナリ)は共有プールにキャッシュされる(2')
  • 実行計画の作成。実行計画とはSQL文を効率よく実行するための手順のこと。ここで作成した実行計画は共有プールにキャッシュされる(2')
③SELECTが使用する表データをデータファイルからデータベースバッファキャッシュに読み込む
④SELECT文の結果をユーザープロセスに返す。この際、SELECT文の内容によってサーバープロセスはPGAを利用する。

UPDATE文の動作

以下は「AAA」というデータを「BBB」に変更するプロセス。
①ユーザープロセスはサーバープロセスにUPDATE文を送信する。
②サーバープロセスが送信されたUPDATE文を解析する。解析手順はSELECT文と同じ。
③UPDATE文で使用するデータをデータベースバッファキャッシュに読み込む。読み込んだデータはほかのユーザーから変更されないようにロックされる。
④REDOログバッファ上に変更履歴情報を作成する。
⑤データベースバッファキャッシュ上のデータが2か所変更される。
  • UNDOブロックと呼ばれる場所に変更前のデータ「AAA」が記録される。
  • 読み込んだデータが「BBB」に変更される。

この状態ではまだトランザクションが確定されてないため、ROLLBACKコマンドで取り消すことができる。ROLLBACKコマンドによる処理では、上記処理中⑤のUNDOブロック中の情報を利用し、変更前の状態に戻す。

COMMIT文の動作

①ユーザープロセスはサーバープロセスにCOMMIT文を送信する。
②LGWRによりCOMMITが実行されたという情報がREDOログバッファに記録される。
③LGWRによりREDOログバッファ上の変更履歴情報がREDOログファイルに書き出される。
④サーバープロセスにより、COMMITが完了したことがユーザープロセスに通知される。また、この段階でデータベースバッファキャッシュの該当データにかかっていたロックが解除される。

COMMIT処理が完了してもデータファイル中の表データは変更前の「AAA」のままである。データファイル中のデータはDBWnの書き込みのタイミングで変更されるが、DBWnはCOMMITのタイミングで書き出しを行わない。データファイルに対するI/Oを減らすためにこのように処理される。
万が一、DBWnが変更後の「BBB」というデータをデータファイルに書き出す前にインスタンスに障害が発生した場合、REDOログファイルに記録されている変更履歴情報(AAA→BBB)からデータファイル中のデータを変更後のデータに書き換えることができる。このようなインスタンスに対する障害発生時のリカバリをインスタンスリカバリと呼ぶ。
戻る

タグ:

+ タグ編集
  • タグ:
最終更新:2014年03月23日 10:32