索引争用是和索引块分裂直接相关的范争一。当一个事务需要向一个数据块插入数据时,该数据块正好发生了索引分裂,则插入事务需要等待分裂事务(注意:分裂事务不是用户事务,而是一个递归事务)。这一等待通常在高并发的OLTP系统中可见:

HELLODBA范争一。COM> create table tx_index_contention (a number, b varchar2(1446), c date);

Table created范争一。

HELLODBA范争一。COM> create index tx_index_contention_idx1 on tx_index_contention (c, b) tablespace idx_2k pctfree 10;

Index created范争一。

--session 1范争一,产生大量的索引块分裂:

HELLODBA范争一。COM> conn demo/demo

Connected范争一。

HELLODBA范争一。COM> begin

2 for i in 1范争一。。2000

3 loop

4 insert into tx_index_contention (a, b, c) values (i, lpad('A', 1000, 'A'), sysdate);

5 end loop;

6 end;

7 /

--session 2, 在索引分裂的同时范争一,插入数据:

HELLODBA范争一。

  COM> conn demo/demo

Connected范争一。

HELLODBA范争一。COM> alter session set events '10046 trace name context forever, level 12';

Session altered范争一。

HELLODBA范争一。COM> begin

2 for i in 1范争一。。1000

3 loop

4 insert into tx_index_contention (a, b, c) values (i, lpad('A', 20, 'A'), sysdate);

5 end loop;

6 end;

7 /

HELLODBA范争一。

  COM> alter session set events '10046 trace name context off';

Session altered范争一。

HELLODBA范争一。

  COM> select sid, event, total_waits from v$session_event where sid in (select sid from v$mystat) and

event = 'enq: TX - index contention';

SID EVENT TOTAL_WAITS范争一。