[轉]Oracle中INITRANS和MAXTRANS參數

來源:互聯網
上載者:User

標籤:

每個塊都有一個塊首部。這個塊首部中有一個事務表。事務表中會建立一些條目來描述哪些事務將塊上的哪些行/元素鎖定。這個事務表的初始大小由對象的INITRANS 設定指定。對於表,這個值預設為2(索引的INITRANS 也預設為2)。事務表會根據需要動態擴充,最大達到MAXTRANS 個條目(假設塊上有足夠的自由空間)。所分配的每個事務條目需要佔用塊首部中的23~24 位元組的儲存空間。注意,對於Oracle 10g,MAXTRANS 則會忽略,所有段的MAXTRANS 都是255。


也就是說,如果某個事物鎖定了這個塊的資料,則會在這個地方記錄事務的標識,當然那個事務要先看一下這個地方是不是已經有人佔用了,如果有,則去看看那個事務是否為活動狀態。如果不活動,比如已經提交或者復原,則可以覆蓋這個地方。如果活動,則需要等待(閂的作用)

所以,如果有大量的並發訪問使用的這個塊,則參數不能太小,否則資源競爭將導致系統並發效能下降。

測試了一下ORACLE 並發事務的時候的塊分配和ITL 管理,
略去大部分的測試過程,大概的結果小結如下:
1. INITRANS =1 時 並發多個INSERT 事務(本次測試最多5個)的時候並不會由於ITL的爭用而等待組塞,ORACLE 採取的策略是每個INSERT事物分配不同的一些塊來使用,這樣各個會話之間就不會產生衝突,除非段沒有多餘的塊(次種情況與本次的主題無關).

2.INITRANS =1 時 並發多個UPDATE事務(本次測試最多7個)的時候也不會由於ITL的爭用而導致等待產生,此時ORACLE除了使用預設的ITL之外,另外動態擴充所需要的ITL,緊緊在非常極端的情況下才會出現等待,(當然應用程式層面的死結或等待與本主題無關)。
1) 該BLOCK沒有FREE空間了,注意FREE參數的設定不能太小。
2) 該塊使用的ITL總數,超過該塊允許的ITL的最大值min(round(block_size*0.5/24) - 2 ,255) 。
   要達到這樣的極端情況實際的生產情況是很難的,應該比業務SQL的死結出現的機率更小。

小結:建立表的時候除非已經清楚,大部分的情況下沒有必要調整INITRANS參數,通常1-4以下足夠用了,INITRANS 設定非常大的時候ORACLE 有出現壞塊的BUG,另外FREE 參數倒是要注意不能隨意改小,除非你已經很清楚更改的後果.


參考部分INSERT 測試代碼 :
( 分3個SESSION insert的 ,x欄位1開頭的是SESSION 1 插入的,其他2個也類似   )

SQL*Plus: Release 10.1.0.4.0 - Production on Wed Apr 16 10:40:17 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.1.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters and Data Mining options

SQL> create table xx (x number) storage(initial 64k next 64k) initrans 2
Table created.
SQL> truncate table xx;
Table truncated.
SQL> select dbms_rowid.rowid_relative_fno(rowid) file#, dbms_rowid.rowid_block_number(rowid) block# from xx;
no rows selected
SQL> INSERT INTO XX SELECT 11 FROM DUAL;
1 row created.
SQL>                                    
SQL> set linesize 200
SQL> column SEGMENT_NAME format a16
select SEGMENT_NAME,EXTENT_ID,BLOCKS,BYTES from user_extents where segment_name =‘XX‘;SQL>

SEGMENT_NAME      EXTENT_ID     BLOCKS      BYTES
---------------- ---------- ---------- ----------
XX                        0        128    1048576

SQL> select x ,dbms_rowid.rowid_relative_fno(rowid) file#, dbms_rowid.rowid_block_number(rowid) block# from xx;

         X      FILE#     BLOCK#
---------- ---------- ----------
        11         51       4590

SQL> INSERT INTO XX SELECT 12 FROM DUAL;

1 row created.

SQL> select x ,dbms_rowid.rowid_relative_fno(rowid) file#, dbms_rowid.rowid_block_number(rowid) block# from xx;

         X      FILE#     BLOCK#
---------- ---------- ----------
        12         51       4534
        11         51       4590

SQL> 
SQL> INSERT INTO XX SELECT 13 from dual;

1 row created.

SQL> select x ,dbms_rowid.rowid_relative_fno(rowid) file#, dbms_rowid.rowid_block_number(rowid) block# from xx;

         X      FILE#     BLOCK#
---------- ---------- ----------
        12         51       4534
        11         51       4590
        13         51       4658

SQL> INSERT INTO XX SELECT 14 from dual;

1 row created.

SQL> select x ,dbms_rowid.rowid_relative_fno(rowid) file#, dbms_rowid.rowid_block_number(rowid) block# from xx;

         X      FILE#     BLOCK#
---------- ---------- ----------
        12         51       4534
        11         51       4590
        13         51       4658
        14         51       4658

SQL> select x ,dbms_rowid.rowid_relative_fno(rowid) file#, dbms_rowid.rowid_block_number(rowid) block# from xx;

         X      FILE#     BLOCK#
---------- ---------- ----------
        12         51       4534
        11         51       4590
        13         51       4658
        14         51       4658

SQL> commit;

Commit complete.

SQL> INSERT INTO XX SELECT 15 from dual;

1 row created.

SQL> insert into xx select 16 from dual;

1 row created.

SQL> commit;

Commit complete.

SQL> select x ,dbms_rowid.rowid_relative_fno(rowid) file#, dbms_rowid.rowid_block_number(rowid) block# from xx order by x;

         X      FILE#     BLOCK#
---------- ---------- ----------
        11         51       4590
        12         51       4534
        13         51       4658
        14         51       4658
        15         51       4658
        16         51       4658
        
        21         51       4537
        22         51       4537
        23         51       4537
        24         51       4537
        25         51       4537
        26         51       4537
        
        
        31         51       4680
        32         51       4614
        33         51       4614
        34         51       4614
        35         51       4614
        36         51       4614

18 rows selected.

[轉]Oracle中INITRANS和MAXTRANS參數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.