enq: TX - index contention基础理论

来源:这里教程网 时间:2026-03-03 14:46:30 作者:

enq: TX - index contention

Occurs when a transaction inserting a row in an index has to wait for the end of an index block split being done by another transaction.

索引分裂发生在当一个索引条目要插入索引块时,发现索引块满了,则会发生索引分裂,有如下几个重要基础概念:

1.索引在创建时会设置pct_free用来为索引未来插入适当的值以及更新做保留空间。2.索引创建后,会首先按照8个块64k的extent分配空间,16个8个块之后,会按照128个块1M来分配extent,分配之后,会在段头位图块来记录块free list,free list可以用做index block split。4.索引键值update,其实并不是像表update一样更新,而是删除旧的索引键值,插入新的索引键值。5.索引的pct_free只在创建索引或者rebuild时计算,这就意味着当索引建立之后,pct_free实际上是被忽略的,索引会在块中一直插入数据直到达到full状态,所以下面索引块满了,即表示块真的满了。4.当索引键值单调递增时,当highest value插入时,发现叶子块满了之后,会发生9-1分裂,表示临近highest value的块99% full,存储highest value的索引快nearly empty,所以单调递增的索引,建议pct_free设置为0,这样可以防止空间由于9-1分裂导致浪费掉pct_free,这是由于索引单调递增,旧的块中数据如果发生5.当索引所在的表插入数据时,如果在索引键值highes value左侧大量插入时,如果索引块满了之后会发生5-5分裂,即两个块各有50%的索引数据,由此可见,频繁发生5-5分裂将大大的浪费空间,造成索引虚胖,5-5分裂、9-1分裂都会大大的影响性能。

常见发生索引分裂情形:

1.索引拥有很高的数据变化量,这个不难理解,当数据变化频繁,需要频繁维护索引时,索引块会频繁的被删除,插入,分裂。2.单调递增的索引,将频繁发生9-1分裂。3.大量删除数据之后,又大量加载数据,将会很大程度发生两种索引分裂。所以针对上述情况,建议如下:1.即可以使用reverse建立反向索引或者建立hash索引,预留足够的pct_free,这样数据较为均衡的被打散且有足够空间用来维护索引,这样可以大大的避免index block split。缺点:会造成index range scan不可能,降低sql性能,排序等受影响。2.单调递增的列,如果使用了sequence,适当的增大cache值,如果可以rac情况下使用noorder sequence不同实例使用不同范围序列值,可能一定程度减少争用,提高性能。3.大量数据加载建议,rebuild或者shrink索引,减少空间浪费,减少索引扫描块数量。4.创建索引或者rebuild时适当增大pct_free,可以延缓发生索引块分裂,用空间换取一定性能提升。

相关推荐