ITL

wadekobe9發表於2012-04-11



檢視T2的事務槽

Select aa.ini_trans,aa.max_trans From dba_tables aa Where table_name='T2'




Create Table t10(Id Int);

Insert Into t10 values(1);

Insert Into t10 values(2);

Insert Into t10 values(3);



檢視資料在快上分佈的位置

Select Id,dbms_rowid.rowid_relative_fno(Rowid) file#,

dbms_rowid.rowid_block_number(Rowid) block# From t10


一個事務開始以後,在一個資料塊上得到一個事務槽,那麼在這個事務提交以前,這個事務槽會一直佔用,直到這個事務提交釋放這個事務槽

只有在已經提交以後,這個itl事務槽中的scn才會有數值。

一個事務在一個資料塊上佔用一個事務槽



如果是insert,預設每個表的ini_trans  itl是2,儘量保持這個資料塊的事務數不超過2,

採用在多個資料塊中插入的情況。這樣將insert分佈到多個資料塊中,防止了itl的爭用。



三個會話同時修改一個資料塊。

事務槽自己增加到了3個。

因為max_trans是255,因此發生ITL爭用的機率也很小。

因此基於上面的兩種情況來說,ITL發生爭用的機率很小。



Cleanout有2種:

1:fast commit cleanout  (提交清除)

2:delayed block cleanout(延遲清除).

提交清除是如何工作的?

Oracle會記錄已修改的塊列表,這些列表可以有20個塊,Oracle根據需要分配多個這樣的列表,

但是如果這些修改的塊加起來超過buffer_cache的10%,oracle就停止分配這樣的列表,因此

當提交時就只會清理最多10%buffer_cache的資料塊,其餘的部分就延遲清除,這樣也是為了

提高commit的效率。U


還有一種情況,就是當事務還未commit時,修改的資料塊已經寫入硬碟,當發生commit時

oracle並不會把block重新讀入做cleanout,而是把cleanout留到下一次對此塊的訪問是完成。 


注意:對於Oracle來說,對於一個事務,可以是快速提交、也可以是延遲提交。目的都是為了提高提交的速度。

提交以後,oracle需要對ITL事務槽、每一行的鎖定標記進行清除。

如果是快速提交,那麼在提交的時候,會將事務表和每一個資料塊的ITL槽進行清除。但是鎖定標記可能沒有清除,等下次用到的時候再進行清除。

如果是延遲提交,那麼在提交的時候,只是將事務表進行清除,並沒有對ITL事務槽進行清除,每一行的鎖定標記也沒有清除。

塊清除的過程並不包括每個行的鎖定標記的清除,主要指的是ITL的清除。

 

1、事務是否已經提交、事務對應的SCN,這些資訊都是以回滾段事務表中的為主,事務槽中的不準確

2、事務槽中的事務id和uba地址是準確的

3、事務槽1中的事務id和回滾段中的事務id肯定不是一樣的,不同回滾段中的事務id也一定不一樣。

4、每一個回滾段塊中都有一個事務id,記錄哪個事務正在使用這個塊。

5、回滾事務表可能被覆蓋,回滾段也可能被覆蓋

對於前者,我們需要增加回滾段

對於後者,我們需要增大回滾段

回滾段也是迴圈使用的,只有活動的回滾段不會被覆蓋


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

相關文章