2017.11.23
ITL
Interested Transaction List
ブロックに発生させた一つのTransactionあたりBlock HeaderにTransactionエントリがListの形で管理される既に説明しました。Header内部Transaction情報を管理するList自体をITLつまり、Interested Transaction Listと言います。Block HeaderのITL内部には、それぞれのTransaction Entryが、内部には、Transaction自体の情報、Row Before情報を持っているUndo SegmentまたはRollback Segment関連情報、TransactionのCommitかどうか、ブロック内にRow Level LockがかかったRow数、Transaction完了時のSCN情報のものが含まれています。Block内Rowは、このITLの一つのEntryとの関係を示します。この部分については、例を使って詳しく説明します。
以下は、Block Dumpを通じたITL情報を見た場合です。
Itl Xid Uba Flag Lck Scn/Fsc 0x01 0x0005.007.0000011a 0x008012e5.00d6.24 C— 0 scn 0x0000.00081ac7 0x02 0x0012.00f.00000b38 0x02000d6f.00ab.0e —- 14 fsc 0x0000.00000000 0x03 0x0000.000.00000000 0x00000000.0000.00 —- 0 fsc 0x0000.00000000 * ITL:ITL内部の一つのSlot(つまり、エントリー)番号を表します。1つのトランザクションごとに1つの ITL Slotが生じます。このSlotはFlagによってCommitになった場合はない事もあります。 * XID:ITL Slotとの関係を結んだTransactionのXID情報です。V$ TRANSACTIONビューでXID情報を見つけることができ、 XIDはトランザクションを一意に識別する事が出来る価です。 * UBA:Transactionが参照しているUndo情報です。Beforeイメージが保存された所を探す時に、これを参照します。 * FLAG:Transactionの状態を示します。「----」のようにどのようなFlagも記録されていない場合、 Transactionが進行中という意味であり、この場合でもCommitを通じて完了した状態で見てもかまわないません。 (Flag情報と関連して、複数の問題が存在します。この部分は以降のセッションで詳しく説明します。) * LCK:このITL Slotを使用するTransactionは、そのBlockのどのRowにLockをかけるのかを示します。 (CommitがされたTransactionのITL SlotでLockを握ったRowがないにも関わらず値が設定されている場合があります。 この場合には、Delayed Block Cleanout部分で追加として扱うものとなります。) * SCN/ FSC:SCNが表示された場合、TransactionがCommitされた場合、その時点のscn情報を記録します。 (FSCの部分は、後に説明します。) *上記の状態は、トランザクションの進行中の状態であるFlag「----」状態と以前のCommitされたTransaction情報を含む 「C---」状態だけがSlotに含まれている場合のみ説明しました。 しかし、これ以外の事項が存在しますので、後で追加の説明をします。
上記ITL情報それぞれをスロット別に分析すると、次の通りとなります。
1)ITL Slot0x01:既にCommitされたTransactionのSlotです。トランザクションがSlotを使用した後、Commitをしたことを表します。Flagの値「C-」にCommitされたことが分かり、トランザクションの完了時点のscnは「0x0000.00081ac7」となります。ただし、Transactionの変更されたRowのBefore イメージを参照するRowがある場合もあります。この時には、UBAとSCN情報を利用して下さい。
2)ITL Slot0x02:現在進行中のTransactionのSlotです。関連XID情報とV$ TRANSACTION情報の組み合わせで進行中のトランザクションの詳細を知ることができます。LCK値が「14」なので、ブロックの合計14個のRowにLockをかけたことがわかります。
3)ITL Slow0x03:このSlotには、すべての値が「0」に設定されています。これが意味するのは、次の2つのうち一つです。
1.Slotが全く使用されていない場合です。 INITRANSにより予め設定されたTransaction Slotがまだ使用されていない場合を表します。
2.最初に使用されたSlotに割り当てられたTransactionがRollbackを実行した場合です。この場合、以前に設定されたITL Slot情報はすべて「0」であるため、この値に戻った事になります。 Rollbackの意味は、Rowデータ情報だけでなく、ITL Slot情報も以前の値に戻しておきます。
– 実際のTransactionは、複数のBlockを変更するので、それぞれは、複数のITL Slotとの関係を結ぶことができます。関係を結ぶことができるITLはテーブルData Blockを基準に見たとき、全体のBlock数だけになります。しかし、実際に影響を及ぼしたRowにインデックスがある場合は、インデックスBlockのITL Slotとの関連付けを結ぶことになるのです。従って、インデックスが多くのテーブルに対してインデックス列の変更がある場合、はるかに多くのBlockのITL Slotとの関連付けを結ぶことになります。