轉(zhuǎn)載:blog.csdn.net/lanyuxinkong/article/details/48135603
每個塊都有一個塊首部。這個塊首部中有一個事務表。事務表中會建立一些條目來描述哪些事務將塊上的哪些行/元素鎖定。這個事務表的初始大小由對象的INITRANS 設置指定。對于表,這個值默認為2(索引的INITRANS 也默認為2)。事務表會根據(jù)需要動態(tài)擴展,最大達到MAXTRANS 個條目(假設塊上有足夠的自由空間)。所分配的每個事務條目需要占用塊首部中的23~24 字節(jié)的存儲空間。注意,對于Oracle10g,MAXTRANS 則會忽略,所有段的MAXTRANS 都是255。
也就是說,如果某個事物鎖定了這個塊的數(shù)據(jù),則會在這個地方記錄事務的標識,當然那個事務要先看一下這個地方是不是已經(jīng)有人占用了,如果有,則去看看那個事務是否為活動狀態(tài)。如果不活動,比如已經(jīng)提交或者回滾,則可以覆蓋這個地方。如果活動,則需要等待(閂的作用)
所以,如果有大量的并發(fā)訪問使用的這個塊,則參數(shù)不能太小,否則資源競爭將導致系統(tǒng)并發(fā)性能下降。
測試了一下oracle并發(fā)事務的時候的塊分配和ITL 管理,
略去大部分的測試過程,大概的結果小結如下:
1. INITRANS =1 時 并發(fā)多個INSERT 事務(本次測試最多5個)的時候并不會由于ITL的爭用而等待組塞,ORACLE 采取的策略是每個INSERT事物分配不同的一些塊來使用,這樣各個會話之間就不會產(chǎn)生沖突,除非段沒有多余的塊(次種情況與本次的主題無關).
2.INITRANS =1 時 并發(fā)多個UPDATE事務(本次測試最多7個)的時候也不會由于ITL的爭用而導致等待產(chǎn)生,此時ORACLE除了使用默認的ITL之外,另外動態(tài)擴展所需要的ITL,緊緊在非常極端的情況下才會出現(xiàn)等待,(當然應用層面的死鎖或等待與本主題無關)。
1) 該BLOCK沒有FREE空間了,注意FREE參數(shù)的設置不能太小。
2) 該塊使用的ITL總數(shù),超過該塊允許的ITL的最大值min(round(block_size*0.5/24) - 2 ,255) 。
要達到這樣的極端情況實際的生產(chǎn)情況是很難的,應該比業(yè)務SQL的死鎖出現(xiàn)的概率更小。
小結:創(chuàng)建表的時候除非已經(jīng)清楚,大部分的情況下沒有必要調(diào)整INITRANS參數(shù),通常1-4以下足夠用了,INITRANS 設置非常大的時候ORACLE 有出現(xiàn)壞塊的BUG,另外FREE?參數(shù)倒是要注意不能隨意改小,除非你已經(jīng)很清楚更改的后果.