REDOログに関する検証 その4

投稿日: 2001年7月25日

< REDOログに関する検証 その4 > ペンネーム つけまい

— 内部構造を理解し
パフォーマンスの向上に役立てる —

前回は、DBWRとLGWRの物理I/Oの相違点などについての解説を行った。

今回は、REDOログ・バッファ(ファイル)へ書き込まれる情報についての解説
を行う。

***** REDOログ・バッファ(ファイル)へ書き込まれる情報 *****

Oracleは、データベース内で変更された全てのブロックに対して、その変更内
容を克明にREDOログ・バッファ(ファイル)へ記録する。全ての変更とは、デー
タセグメントはもちろんのこと、インデックスセグメントやロールバックセグ
メントなども含まれる。

データベース内の任意の1ブロックに加えられた1つの変更を表したものを、
チェンジベクターと呼ぶ。チェンジベクターには、変更したブロックのアドレ
ス(DBA)や、更新後のデータなどが格納される。

データベースに対する原子的な変更を1つ記述した一連のチェンジベクターの集
まりのことを、REDOレコードと呼ぶ。一部のトランザクションでは、複数の
REDOレコードが生成され、各REDOレコードに一連のチェンジベクターが格納さ
れる構造となっている。

チェンジベクター及びREDOレコードが生成される過程を、以下の例を基に追っ
てみよう。

—– SQL文 —–

UPDATE WORK03
SET EMPNO = 9999
WHERE EMPNO = 1111 ;

※ 項目EMPNOには、インデックスは作成していない

—————–

上記のUPDATE文を実行すると、次の様なチェンジベクターが生成される。

1.ロールバックセグメント内のトランザクション表(ヘッダー)に対する
   チェンジベクター

   変更されたブロックのアドレスや、該当トランザクションの状態(コミッ
   トまたはアクティブ)及び、該当トランザクションのUNDOが格納されてい
   るロールバックセグメント内の位置情報などを記録しているトランザクショ
   ン表を変更する際に、チェンジベクターが生成される

2.ロールバックセグメント内のデータブロックに対するチェンジベクター

   更新前の値(1111)を、ロールバックセグメント内のブロックに格納(変更)
   する際に、チェンジベクターが生成される

3.WORK03テーブル内の該当ブロックに対するチェンジベクター

  更新後の値(9999)を、WORK03テーブル内の該当ブロックに上書き(変更)
  する際に、チェンジベクターが生成される

上記のことから、このトランザクションに対するREDOレコードには、3つのチェ
ンジベクターが格納されることになる。もちろん、これ以外にもREDOレコード
が生成される場合がある。たとえば、更新の対象となる項目にインデックスが
存在する場合、そのインデックスキーに対しても変更が必要となり、この場合
は2つ目のREDOレコードが生成されることになる。この時も、1つ目のREDOレコー
ドと同様、複数のチェンジベクターが格納される。また、このトランザクショ
ンの後にCOMMIT文を発行した場合、3つ目のREDOレコードが生成される。

チェンジベクターおよび、REDOレコードについて、ご理解いただけたであろうか?

次回は、DUMPコマンドを用いて、実際のREDOログ・ファイルの中身を覗いてみよう。

以上 夏本番を迎えた茅ヶ崎にて