1,enq: TX- index contention等待事件的概念
2,如何产生此等待事件
3,如何解决等待事件
4,小结
.
1,enq: TX- index contention等待事件的概念
1,当在基于索引的表中插入一条记录时,此时正好另一会话事务正在操作这个索引块正处于分裂状态(即索引块分裂)
2,如何产生此等待事件
--构造等待事件 enq: TX- index contention,如高并发引发此事件
--并发job
declare
v_job pls_integer;
begin
for i in 1..100 loop
dbms_job.submit(v_job,what => 'proc_arg;',next_date => sysdate,interval=>'sysdate+1');
commit;
end loop;
end;
/
--并发job调用的存储过程
create or replace procedure proc_arg
as
begin
insert into t_detail values(1);
--dbms_lock.sleep(120);
--commit;
end;
--查询是否发生了enq: TX- index contention事件
--先温习下v$session_wait视图几个重要列的含义:
1,WAIT_TIME_MICRO,
1,单位为毫秒
2,如当前会话处于等待,则为已等待占用的时间
3,如当前会话已停止等待,则为最近一次等待占用的时间
2,TIME_REMAINING_MICRO
1,本参数有几类值
2,若值>0,则表示还要等待多久时间
若值=0,则表示当前会话已超时
若值=-1,则表示不知还要等待多久
若值=null,表示当前会话未处于等待状态
--由下可知,不知还要等多久
SQL> select event,WAIT_TIME_MICRO,TIME_REMAINING_MICRO from v$session_wait where event like '%enq: TX - index contention%';
3,如何解决等待事件
1,重构索引,建立反向键索引
2,增大索引的pctfree
https://blog.csdn.net/lihuarongaini/article/details/101402146