怎么理解Oracle中INITRANS和MAXTRANS参数

网友投稿 428 2023-12-18

怎么理解Oracle中INITRANS和MAXTRANS参数

怎么理解Oracle中INITRANS和MAXTRANS参数,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

怎么理解Oracle中INITRANS和MAXTRANS参数

INITRANS:

INITRANS 指的是一个 BLOCK 上初始预分配给并行交易控制的空间 (ITLs)

( 当 BLOCK 上某笔 ROW 被交易更新锁定时,会在 BLOCK header ITL allocate 一个锁,当下一个交易要更新同一笔 row 时,就会发现他已经被先前的交易持有锁了,会先去检查该交易是否 active? 如果是,后来的该笔交易就会被 blocking ,等待 ) 如果一个表格需要同时有大量交易存取,你应该设定 INITRANS 大一点,可以减少 ITL 还要动态扩充的 Overhead 。

For tables INITRANS defaults to 1 for indexes 2

MAXTRANS:

MAXTRANS 指的是如果 INITRANS 空间不够用了,就会自动扩展 ITL ,直到最大值也就是 MAXTRANS 值为止,预设是 255 。但是,如果 BLOCK 空间已经不足,也有可能无法持续扩充到 255 个 ITS 空间喔。

每个块都有一个块首部。这个块首部中有一个事务表。事务表中会建立一些条目来描述哪些事务将块上的哪些行/元素锁定。这个事务表的初始大小由对象的INITRANS 设置指定。对于表,这个值默认为1(索引的INITRANS 默认为2)。事务表会根据需要动态扩展,最大达到MAXTRANS 个条目(假设块上有足够的自由空间)。所分配的每个事务条目需要占用块首部中的23~24 字节的存储空间。注意,对于Oracle 10g,MAXTRANS 则会忽略,所有段的MAXTRANS 都是255。

也就是说,如果某个事物锁定了这个块的数据,则会在这个地方记录事务的标识,当然那个事务要先看一下这个地方是不是已经有人占用了,如果有,则去看看那个事务是否为活动状态。如果不活动,比如已经提交或者回滚,则可以覆盖这个地方。如果活动,则需要等待(闩的作用)

所以,如果有大量的并发访问使用的这个块,则参数不能太小,否则资源竞争将导致系统并发性能下降。

测试了一下ORACLE 并发事务的时候的块分配和ITL 管理,

略去大部分的测试过程,大概的结果小结如下:

1. INITRANS =1 时 并发多个INSERT 事务(本次测试最多5个)的时候并不会由于ITL的争用而等待组塞,ORACLE 采取的策略是每个INSERT事物已经操作完成,属于不活动事物,只等待commit或者rollback,这样各个会话之间就不会产生冲突,除非段没有多余的块(次种情况与本次的主题无关).

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 参数倒是要注意不能随意改小,除非你已经很清楚更改的后果.

SQL>  create table xx (x number) storage(initial 64k next 64k) initrans 2;

Table created.

SQL>

SQL> create table a as select * from xx;

Table created.

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> select SEGMENT_NAME,EXTENT_ID,BLOCKS,BYTES from user_extents where segment_name =XX;

SEGMENT_NAME     EXTENT_ID     BLOCKS      BYTES

--------------- ---------- ---------- ----------

XX                       0          8      65536

SQL> select TABLE_NAME,STATUS,PCT_FREE,PCT_USED,INI_TRANS,MAX_TRANS,INITIAL_EXTENT,NEXT_EXTENT,MIN_EXTENTS,MAX_EXTENTS,PCT_INCREASE from user_tables where table_name=XX;

TABLE_NAME                     STATUS     PCT_FREE   PCT_USED  INI_TRANS  MAX_TRANS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE

------------------------------ -------- ---------- ---------- ---------- ---------- -------------- ----------- ----------- ----------- ------------

XX                             VALID            10         40          2        255          65536       65536           1  2147483645

SQL>

SQL> INSERT INTO a SELECT 11 FROM DUAL;

1 row created.

SQL> commit;

Commit complete.

SQL> select TABLE_NAME,STATUS,PCT_FREE,PCT_USED,INI_TRANS,MAX_TRANS,INITIAL_EXTENT,NEXT_EXTENT,MIN_EXTENTS,MAX_EXTENTS,PCT_INCREASE from user_tables where table_name=A;

TABLE_NAME                     STATUS     PCT_FREE   PCT_USED  INI_TRANS  MAX_TRANS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE

------------------------------ -------- ---------- ---------- ---------- ---------- -------------- ----------- ----------- ----------- ------------

A                              VALID            10         40          1        255          65536     1048576           1  2147483645

SQL> select SEGMENT_NAME,EXTENT_ID,BLOCKS,BYTES from user_extents where segment_name =A;

SEGMENT_NAME     EXTENT_ID     BLOCKS      BYTES

--------------- ---------- ---------- ----------

A                        0          8      65536

SQL>  INSERT INTO XX SELECT 12 FROM DUAL;

1 row created.

SQL> INSERT INTO a 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#

---------- ---------- ----------

        11          1      94665

        12          1      94665

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

X      FILE#     BLOCK#

---------- ---------- ----------

        11          1     102801

        12          1     102801

SQL> INSERT INTO XX SELECT 13 from dual;

1 row created.

SQL> INSERT INTO a 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#

---------- ---------- ----------

        11          1      94665

12          1      94665

        13          1      94665

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

         X      FILE#     BLOCK#

---------- ---------- ----------

11          1     102801

        12          1     102801

        13          1     102801

SQL> INSERT INTO XX SELECT 14 from dual;

1 row created.

SQL> INSERT INTO a 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#

---------- ---------- ----------

        11          1      94665

        12          1      94665

13          1      94665

        14          1      94665

SQL>

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

         X      FILE#     BLOCK#

---------- ---------- ----------

        11          1     102801

        12          1     102801

        13          1     102801

14          1     102801

SQL> commit;

Commit complete.

SQL> INSERT INTO XX SELECT 15 from dual;

1 row created.

SQL> INSERT INTO a SELECT 15 from dual;

1 row created.

SQL> INSERT INTO XX SELECT 16 from dual;

1 row created.

SQL> INSERT INTO a 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;

X      FILE#     BLOCK#

---------- ---------- ----------

        11          1      94665

        12          1      94665

13          1      94665

        14          1      94665

        15          1      94665

        16          1      94665

6 rows selected.

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

         X      FILE#     BLOCK#

---------- ---------- ----------

        11          1     102801

12          1     102801

        13          1     102801

        14          1     102801

        15          1     102801

16          1     102801

6 rows selected.

SQL>    

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

         X      FILE#     BLOCK#

---------- ---------- ----------

11          1      94665

        12          1      94665

        13          1      94665

        14          1      94665

15          1      94665

        16          1      94665

        21          1      94665

        22          1      94665

23          1      94665

        24          1      94665

        25          1      94665

         X      FILE#     BLOCK#

---------- ---------- ----------

        26          1      94665

        31          1      94665

        32          1      94665

33          1      94665

        34          1      94665

        35          1      94665

        36          1      94665

18 rows selected.

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

         X      FILE#     BLOCK#

---------- ---------- ----------

        11          1     102801

12          1     102801

        13          1     102801

        14          1     102801

        15          1     102801

16          1     102801

        21          1     102801

        22          1     102801

        23          1     102801

24          1     102801

        25          1     102801

         X      FILE#     BLOCK#

---------- ---------- ----------

26          1     102801

        31          1     102801

        32          1     102801

        33          1     102801

34          1     102801

        35          1     102801

        36          1     102801

18 rows selected.

另开一个窗口插入:

INSERT INTO XX SELECT 21 from dual;

INSERT INTO XX SELECT 22 from dual;

INSERT INTO XX SELECT 23 from dual;

INSERT INTO XX SELECT 24 from dual;

INSERT INTO XX SELECT 25 from dual;

INSERT INTO XX SELECT 26 from dual;

INSERT INTO A SELECT 21 from dual;

INSERT INTO A SELECT 22 from dual;

INSERT INTO A SELECT 23 from dual;

INSERT INTO A SELECT 24 from dual;

INSERT INTO A SELECT 25 from dual;

INSERT INTO A SELECT 26 from dual;

commit;

再开一个窗口插入:

INSERT INTO XX SELECT 31 from dual;

INSERT INTO XX SELECT 32 from dual;

INSERT INTO XX SELECT 33 from dual;

INSERT INTO XX SELECT 34 from dual;

INSERT INTO XX SELECT 35 from dual;

INSERT INTO XX SELECT 36 from dual;

INSERT INTO A SELECT 31 from dual;

INSERT INTO A SELECT 32 from dual;

INSERT INTO A SELECT 33 from dual;

INSERT INTO A SELECT 34 from dual;

INSERT INTO A SELECT 35 from dual;

INSERT INTO A SELECT 36 from dual;

commit;

查询:

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

         X      FILE#     BLOCK#

---------- ---------- ----------

11          1      94665

        12          1      94665

        13          1      94665

        14          1      94665

15          1      94665

        16          1      94665

        21          1      94665

        22          1      94665

23          1      94665

        24          1      94665

        25          1      94665

         X      FILE#     BLOCK#

---------- ---------- ----------

        26          1      94665

        31          1      94665

        32          1      94665

33          1      94665

        34          1      94665

        35          1      94665

        36          1      94665

18 rows selected.

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

         X      FILE#     BLOCK#

---------- ---------- ----------

        11          1     102801

12          1     102801

        13          1     102801

        14          1     102801

        15          1     102801

16          1     102801

        21          1     102801

        22          1     102801

        23          1     102801

24          1     102801

        25          1     102801

         X      FILE#     BLOCK#

---------- ---------- ----------

26          1     102801

        31          1     102801

        32          1     102801

        33          1     102801

34          1     102801

        35          1     102801

        36          1     102801

18 rows selected.

SQL> select TABLE_NAME,STATUS,PCT_FREE,PCT_USED,INI_TRANS,MAX_TRANS,INITIAL_EXTENT,NEXT_EXTENT,MIN_EXTENTS,MAX_EXTENTS,PCT_INCREASE from user_tables where table_NAME IN(XX,A);

TABLE_NAME                     STATUS     PCT_FREE   PCT_USED  INI_TRANS  MAX_TRANS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE

------------------------------ -------- ---------- ---------- ---------- ---------- -------------- ----------- ----------- ----------- ------------

A                              VALID            10         40          1        255          65536     1048576           1  2147483645

XX                             VALID            10         40          2        255          65536       65536           1  2147483645

SQL>       

SQL> select OWNER,INDEX_NAME,TABLE_OWNER,TABLE_NAME,UNIQUENESS,INI_TRANS,MAX_TRANS,INITIAL_EXTENT,NEXT_EXTENT,MIN_EXTENTS,MAX_EXTENTS,PCT_INCREASE,PCT_FREE,STATUS from dba_indexes where table_owner=SYS and table_name IN(XX,A);

OWNER      INDEX_NAME TABLE_OWNE TABLE_NAME UNIQUENES  INI_TRANS  MAX_TRANS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE   PCT_FREE STATUS

---------- ---------- ---------- ---------- --------- ---------- ---------- -------------- ----------- ----------- ----------- ------------ ---------- --------

SYS        IDX_XX     SYS        XX         NONUNIQUE          2        255          65536     1048576           1  2147483645                      10 VALID

SYS        IDX_A      SYS        A          NONUNIQUE          2        255          65536     1048576           1  2147483645                      10 VALID

SQL>    

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:怎么解析EXPDP/IMPDP各种应用场景
下一篇:OGG中add trandata的含义是什么
相关文章

 发表评论

暂时没有评论,来抢沙发吧~