当事务修改索引中的数据时,而相关索引块没有足够的空间的时候,就会发生索引块的分割,在分割的过程中前台进程需要等待分割完毕才能继续操作。
如果这个时候其他会话也要修改这个索引块的数据,那么将会出现索引块的竞争。
(end: TX- index contention).一般索引块的分割持有资源和释放非常短,并不会对数据库造成严重的影响。但是对表操作并发量很大的情况下可能导致严重的竞争。
1.创建测试表
SQL> CREATE TABLE TEST(ID INT,NAME VARCHAR2(50),CREATED DATE);
表已创建。
SQL> BEGIN
2 FOR I IN 10000..20000 LOOP
3 INSERT INTO TEST
4 VALUES(I,RPAD(I,50,'X'),SYSDATE);
5 END LOOP;
6 END;
7 /
PL/SQL 过程已成功完成。
SQL> COMMIT;
提交完成。
SQL> SELECT COUNT(1) FROM TEST;
COUNT(1)
----------
10001
SQL> CREATE INDEX IDX_TEST_01 ON TEST(ID,NAME) PCTFREE 0;
首先创建了一个测试表TEST,并向里面插入了10001 条记录,ID 最小是10000,最大
是20000。
然后再TEST 的ID,NAME 列上创建了升序索引。此时索引中的数据将会先按照ID 排
序,再按照NAME 列排序。注意我将PCTFREE 设置为0。这将会导致叶子节点块的空间都
填满了,当然B 树索引的最右边的叶子块除外(可能填满也可能没填满)。准备工作完成。
2.索引的信息
首先我们分析一下这个索引的情况。
SQL> ANALYZE INDEX IDX_TEST_01 VALIDATE STRUCTURE;
索引已分析
SQL> SELECT HEIGHT,BLOCKS,NAME,LF_ROWS,LF_BLKS,PCT_USED FROM INDEX_STATS;
索引分裂引发的enq: TX - index contention.
最新推荐文章于 2024-06-27 14:11:31 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)