ITPub博客

首页 > Linux操作系统 > Linux操作系统 > enq:TX - index contention

enq:TX - index contention

原创 Linux操作系统 作者:myownstars 时间:2011-06-07 15:33:25 0 删除 编辑


TX-Transaction (index contention) : Lock held on an index during a split to prevent other operations on it—查询v$enqueue_statistics
说明索引块出现分裂,一个事务向一个数据块插入数据,该数据块正好发生分裂,则插入事务需要等待分裂事务(分裂事务是一个递归事务),通常高并发的OLTP系统。

如何分裂:
当一个事务修改索引块上的数据,但没有足够的空间容纳新的数据时,会将原有块上部分数据放到一个新的数据块上,此为索引块分裂;

可分为:叶子节点块分裂/枝节点分裂,以及 5-5分裂和9-1分裂
叶子节点分裂:叶子节点上没有足够的空间容纳新插入的数据,或者没有足够的空间容纳新的ITL slot,一个ITL slot为24B;
枝节点分裂:其下层的节点分裂,会导致在该节点上增加一条记录指向新加的节点,当该节点空间不足时,会发生分裂;
根节点分裂:特殊的枝节点分裂,分裂需要两个新的数据块,将原有数据转移至两个新节点,原有节点上生成两条记录分别指向新增的数据块

9-1分裂:事务向索引最后一个叶子节点数据块上插入一条rowid大于或等于最大rowid的数据,且该数据块上没有其他未提交的事务,此时若没有足够的空间,则发生9-1分裂;
5-5分裂:1、新插入数值小于索引中最大值2、数据块上没有足够的ITL Slot 3、新插入数据大于或等于索引中最大值,但是数据块上还存在其他未提交的事务

9-1分裂通常为该表主要为插入操作,确保新的数据块有最大的空闲空间;5-5分裂通常是表上并发事务多,且插入、删除数据比较分散,需保证新老数据块都有相当的空闲空间以容纳新事务;

Pctfree在块分裂时会被忽略

分裂事务控制
索引分裂由导致分裂的用户事务中的递归事务控制的,对资源的请求和释放都在该递归事务中完成;
枝节点上只有一个ITL slot,用于发生分裂时的递归事务;叶子节点上第一个ITL slot也是用于分裂使用;

数据块分配
索引分裂时候,从freelist中找空闲块;如果索引数据块上数据全部被删除,即会放在freelist前面,但不会从B数结构中删除;
只要数据块实际数据为0,不管有没有提交,都会放到freelist上;如果此时发生分裂,该块会被获取,但是由于事务未提交,不会被分配,反复如此会导致I/O增加;

Enq: TX-Index contention
当一个事务需要插入/删除某个索引块上的数据,而这个数据块正在被另一个事务分裂时,则需要等待分裂完成才能修改数据
Enq: TX-allocate ITL entry
1、达到数据块上最大事务数限制 2、递归事务ITL争用,当一个事务中递归事务请求分裂一个索引块时,此时正被另一个事务分裂
除了索引块,对于表数据块,造成该等待原因包括 initrans太少,没有足够的空间分配一个新的ITL slot (索引块不会有类似问题,此情形下会发生索引块分裂)

解决方法:需要减少索引分裂的次数
1、  减小索引大小  --选择性强的列的放前面,减小枝节点大小;压缩索引
2、  碎片较多的索引进行rebuild或者shrink space
3、  对于很少更新的表,使用大数据块表空间

确认索引碎片
Analyze index index_name validate structure online;

select name,
           del_lf_rows,
           lf_rows,
           round((del_lf_rows/(lf_rows+0.0000000001))*100) frag_pct
   from index_stats
    一般如果该索引的frag_pct>10%,那么就需要rebuild index

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15480802/viewspace-697307/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-03-18

  • 博文量
    375
  • 访问量
    3164733