索引争用是和索引块分裂直接相关的范争一。当一个事务需要向一个数据块插入数据时,该数据块正好发生了索引分裂,则插入事务需要等待分裂事务(注意:分裂事务不是用户事务,而是一个递归事务)。这一等待通常在高并发的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范争一。
发布评论