TX:ITL LOCK(INITRANS,MAXINTRANS)

简介: 今天和老周老肖吃饭之于谈论了一个问题,就是INITRANS,MAXINTRANS对高并发量的数据块的影响。大家都知道在进行大量DML对同一个块的时候(不同行),不会出现TX:ROW LOCK,但是由于ITL的限制这样的操作可能出现TX:ITL LOCK(MODE=4),以前我遇到过各种TX TM,但是ITL确实没有遇到过,我记得10G的不管ASSM还是MSSM都是默认的最打MAXTRANS为255,所以没怎么关注,因为如果要达到这个值需要255个TRANSACTION对同一个块进行修改,基本不可能。

今天和老周老肖吃饭之于谈论了一个问题,就是INITRANS,MAXINTRANS对高并发量的数据块的影响。
大家都知道在进行大量DML对同一个块的时候(不同行),不会出现TX:ROW LOCK,但是由于ITL的限制
这样的操作可能出现TX:ITL LOCK(MODE=4),以前我遇到过各种TX TM,但是ITL确实没有遇到过,我记得
10G的不管ASSM还是MSSM都是默认的最打MAXTRANS为255,所以没怎么关注,因为如果要达到这个值需要
255个TRANSACTION对同一个块进行修改,基本不可能。
但是我却忽略了一点:
DIS402 3-19
Before the block reaches  PCTFREE, the free space is
used both for insertion of new rows and by the growth of the data block header.
可以发现PCTFREE除了存储可能的UPDATE数据还存储扩张的BLOCK header。

测试:
SQL>  create tablespace testo1
  2   datafile '/oradata/xuexi/XUEXI/datafile/testo1.dbf' size 50m segment space management AUTO;
SQL>  create tablespace testo2
  2   datafile '/oradata/xuexi/XUEXI/datafile/testo2.dbf' size 50m segment space management manual;
SQL>   create table test2
  2    initrans 100 maxtrans 200
  3    tablespace testo1
  4    as
  5    select * from dba_users;
 
Table created
 
SQL>
SQL>  create table test3
  2    initrans 100 maxtrans 200
  3    tablespace testo2
  4    as
  5    select * from dba_users;
  SQL> select TABLE_NAME,FREELISTS,PCT_FREE,PCT_USED,INI_TRANS,MAX_TRANS from user_tables where table_name in('TEST2','TEST3');
 
TABLE_NAME                      FREELISTS   PCT_FREE   PCT_USED  INI_TRANS  MAX_TRANS
------------------------------ ---------- ---------- ---------- ---------- ----------
TEST2                                             10                   100        255
TEST3                                   1         10         40        100        255
可以看到我们只能指定INI_TRANS,MAX_TRANS默认就是255,同时可以看到MSSM的PCT_FREE和PCT_USED都生效了因为他是FREELIST管理的(freelists=1),
而ASSM却只有PCT_FREE,而PCT_USED,freelists均为空,所以他是位图进行管理空块的,而PCT_FREE是必须因为剩余多少空间给UPDATE和扩张的ITL还是
它来指定,而为了避免FREELIST的争用,大家要尽量使用ASSM,默认的10G就是。
默认的INDEX的INI_TRANS=2,表的INI_TRANS=1,MAX_TRANS都是255,这样就出现一个问题,如果没有足够的PCTFREE来进行扩张ITL,即便MAX_TRANS为65555也没用,
所以如果出现ITL LOCK(MODE=4),大家应该考虑是:
1、增加PCTFREE
2、增加初始的块的ITL及提高INI_TRANS。
其实这样的情况很少,但是遇到还是要注意。

SQL> alter table test2 pctfree 40 initrans 150;
 
Table altered
 
SQL> select TABLE_NAME,FREELISTS,PCT_FREE,PCT_USED,INI_TRANS,MAX_TRANS from user_tables where table_name in('TEST2');
 
TABLE_NAME                      FREELISTS   PCT_FREE   PCT_USED  INI_TRANS  MAX_TRANS
------------------------------ ---------- ---------- ---------- ---------- ----------
TEST2                                             40                   150        255

但是这个操作只对后来分配的BLOCK生效,如果对现有的表,只有MOVE了,根据需求看看是否NOLOGGING
SQL> alter table test2 move pctfree 30 initrans 170;
 
Table altered
当然索引也可以一样处理

SQL> select TABLE_NAME,index_name,FREELISTS,PCT_FREE,INI_TRANS,MAX_TRANS from user_indexes ;
 
TABLE_NAME                     INDEX_NAME                      FREELISTS   PCT_FREE  INI_TRANS  MAX_TRANS
------------------------------ ------------------------------ ---------- ---------- ---------- ----------
TEST3                          TEST_IN                                           10          2        255

注意索引没有PCT_USED,是否进行插入数据不是PCT_USED控制的,是根据ROWID确定的。同时对于索引来说,其pctfree仅仅是在create或rebuild时生效,对与后续的插入、修改之类的操作来说是无效的,pctfree的设置也仅仅是为了延缓由于insert等操作而导致的的索引块分裂。

SQL> alter index test_in  pctfree 30;
 
alter index test_in  pctfree 30
 
ORA-02243: invalid ALTER INDEX or ALTER MATERIALIZED VIEW option
所以索引只能修改INITRANS
 
SQL>
SQL>
SQL> alter index test_in  initrans 170;
 
Index altered

 

目录
打赏
0
0
0
0
91
分享
相关文章
20161208理解enq TX - row lock contention
[20161208]理解enq TX - row lock contention.txt >SELECT * FROM v$event_name WHERE name = 'enq: TX - row lock contention'; EVENT#   EVEN...
1086 0
【故障处理】队列等待之enq: TX - row lock contention
【故障处理】队列等待之enq: TX - row lock contention 1  BLOG文档结构图   2  前言部分 2.
1593 0
[20140130]关于enq TX-allocate ITL entry
  昨天遇到一例enq TX - allocate ITL entry等待事件,就是维护人员打开多个会话更新一个表的某个字段,开始以为等待与undo有关,查 看才发现是"enq TX - allocate ITL entry",因为没有业务操作,建议修改为ctas来建立新表,建立相关索引,然后改名完成操作.
1003 0
[20150721]enq TX - allocate ITL entry
[20150721]enq TX - allocate ITL entry.txt --昨天我做了一个测试链接: http://blog.itpub.net/267265/viewspace-1742243/ --本想通过这个例子说明为什么8K数据块Hakan Factor=736? --晚上我想到一种这种特殊的表会不会产生enq TX - allocate ITL entry,也就是itl不足的情况。
996 0
关于enq: TX - allocate ITL entry的问题分析
今天发现系统在下午1点左右的时候负载比较高,就抓取了一个最新的awr报告. Snap Id Snap Time Sessions Curs...
1395 0
ORACLE等待事件:enq: TX - row lock contention
enq: TX - row lock contention等待事件,这个是数据库里面一个比较常见的等待事件。enq是enqueue的缩写,它是一种保护共享资源的锁定机制,一个排队机制,先进先出(FIFO)。
1743 0
enq: CF - contention 等待事件
背景说明:用户反馈数据库运行很慢,但是等查看的时候又恢复了正常,果断的查看了过去一段时间的AWR报告; AWR报告信息如下:   从db time/Elapsed显示数据库的压力并不是很大。
1363 0