ITL事務槽記載-01

dotaddjj發表於2011-10-24

前面有記載過關於塊清除的blog,發現自己還是不太理解,又翻看了一些資料。還是要做一點別的知識的準備!

借鑑網路上的前輩的ITL記載,瞭解一下關於oracle中的ITL

ITLInterested transaction list也就是事務槽,記得oracle concept中第二篇關於資料塊 擴充套件 段的介紹中就提到了資料塊的結構:塊頭,表目錄,行目錄,資料行,可用空間區。

首先我們dump一個資料塊吧

select file_id,block_id from dba_extents where segment_name='TT02'

4 2009

由於段空間自動管理中extent是用點陣圖來管理block的使用 空閒資訊的,所以這裡我們選擇第四塊也就是2012 資料塊

Alter system dump datafile 4 block max 2012 block min 2012

部分資訊:

Start dump data blocks tsn: 4 file#: 4 minblk 2012 maxblk 2012

buffer tsn: 4 rdba: 0x010007dc (4/2012)

scn: 0x0000.0024a014 seq: 0x02 flg: 0x04 tail: 0xa0140602

frmt: 0x02 chkval: 0x418c type: 0x06=trans data

Hex dump of block: st=0, typ_found=1

Dump of memory from 0x08CA8400 to 0x08CAA400

。。。。。。

Block header dump: 0x010007dc

Object id on Block? Y

seg/obj: 0xe8bc csc: 0x00.24a013 itc: 3 flg: E typ: 1 - DATA

brn: 0 bdba: 0x10007d9 ver: 0x01 opc: 0

inc: 0 exflg: 0

Itl Xid Uba Flag Lck Scn/Fsc

0x01 0x0009.012.000002ee 0x00800090.02a5.2e ---- 1 fsc 0x0000.00000000

0x02 0x0001.01a.00000267 0x00800b2d.02c1.17 ---- 1 fsc 0x0000.00000000

0x03 0x0007.01b.0000026f 0x00801be6.01dc.08 ---- 1 fsc 0x0000.00000000

可以發現在最後的block header dump中記錄了block中的可用空間區的事務槽的資訊(黑體字部分),其中包括scnundo地址也就是UBa(這個是consistant read的基礎),事務資訊XID,事務影響該block的條數LCK,事務資訊flag。

block也會scn資訊,一個ITL對應一個scn,但是由於一個事務可能會改變多個資料塊,所以一個事務可能會在多個資料塊中產生ITL資訊。

一條sql語句oracle如何找出資料塊得到結果的,其實在於ITL中記錄的scnUba。一個sql語句oracle先記錄查詢開始的scn,然後在buffer cache中查詢需要的block或者從磁碟讀入buffer cache然後再在buffer cache找查詢,如果此時別的session修改了資料或正在修改資料,就會在相應的block上記錄ITLITL中會有scn uba lock等。此時oracle發現ITL中記錄的scn大於select時刻的scn,那麼oracle就會根據ITL中的Uba找到undo資訊獲得block的前映象,然後在buffer cache構造出CR塊,此時oracle也會檢查構造出的block中記錄的ITLscn,如果scn還大於select時刻的scn,那麼就一直重複構造前映象,然後oracle找到前映象block中的ITLscn是否還小於select時刻的scn,(同時檢查事務是否提交完成)如果沒有繼續構造前映象,直到找到需要的block為止,當然如果在前映象中無法找到所需的undo資訊。其實也就是經常提到的ora-01555快照過舊,此時也就是oracle多版本的本質,一個select語句總是會看到consistant gets了,但是cr塊可以產生也可以不產生。

前些天提到了create table的命令,能寫全真不容易

Create table tt03(a number,b number)

Pctfree 0

Initrans 2

Maxtrans 255

Storage(

initial 100K

next 100K

minextent 1

maxextent unlimited

pctincrease 0)

指定了表段的引數,其中的pctfree用於多少空間更新資料塊內的已有資料,initrans引數指定資料塊內的初始分配的事務槽,預設初始是2,最大上限maxtrans255(不過在10G

該引數就被忽略)

10g中預設的pctfree10,如果pctfree設定較小,很可能在更新資料塊內的資料時導致資料塊無法容納,進而產生行遷移,當查詢資料時會掃描更多的資料塊影響效能。

既然說到了pctfree引數記得以前檢視oracle concept中有過下面的記錄

關於資料塊的可用空間區的事務條目:

其中oracle concept中就提到了如果此資料塊屬於索引,簇表或表的資料段時,在其可用空間區還可能儲存事務條目。此資料塊中資料行row正在dml語句訪問時,此資料塊中就需要儲存事務條目

此時如果建立一個pctfree0的表段,由於初始分配的initrans只是2,如果多於三個事務很自然的會發生徵用ITL的情況。

Create table tt05(id numer) pctfree 0

declare

i number;

begin

for i in 1..1000 loop

insert into tt05 values(i);

commit;

end loop;

end;

session A:

update tt05 set id=30 where id<30 and id>20

session B:

update tt05 set id=20 where id<20 and id>10

session C:

update tt05 set id=10 where id>10

session C會出現等待,session A和session B要都佔用了一個事務槽,此時由於pctfree引數為0無法分配ITL給session c,必須等待前面的用完了才能回收使用。

由於對塊清除 事務槽回滾段的理解還是不夠清晰,這段時間會繼續找資料加深自己理解也會更新blog,晚了 睡了!

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25362835/viewspace-1055904/,如需轉載,請註明出處,否則將追究法律責任。

相關文章