Oracle高并发系列1:DML引起的常见问题及优化思路(2)
解决思路:? ?
背景知识: Oracle在索引split时中寻找可复用的free block的过程如下: Oracle不会一开始就让index segment申请分配新的空间(这会造成index segment的空间过度增长),而是到该index segment的其它地方搜索是否存在可用的Free Block,这些Free Block的要求是status是75%-100% Free的,server process会扫描这些75%-100% Free的block 并确认这些block 实际上是100%空的,如果找到100% Free Block则使用;如果没有则继续搜索,直到所有候选block都被检查过,这个行为叫做 probes on index block reclamation.每次寻找空块并failed,oracle就会增加这个统计指标: “failed probes on index block reclamation”.Oracle内部机制会控制要找多少次,不会去FULL SCAN所有index block的,failed超过一定次数后就会申请分配新的block. 不能重用的原因有2个:??
在这个过程中,Oracle还有机会找到的block其实已经是索引结构中的一个非空block,但是Oracle只会在splittingand relinking to index structure之后才会发现这个block其实是illegal的选择,这个时候Oracle会回滚这个操作,这个统计记录在‘transaction rollback’ in v$sysstat,然后继续寻找另外一个block. Oracle进行找空块的过程中,如果这些块不在内存中,会增加物理读,如果这些块还需要做延迟块清除或者还要回滚,则需要触发更多系统递归操作,可见,如果“failed probes”过多,split效率低下时,会直接导致index contention增加. TABLE的High WaterMark(即高水位线)标识table segment中已用空间和未用空间的边界,具体来讲,HWM以上的block的状态是:unformattedand have never been used; HWM以下的block的状态是:Allocated,but currentlyunformatted and unused、 Formatted and contain data、Formatted and empty because the data was deleted.当HWM以下的block都无空闲空间可以使用时,Oracle会推进HWM来申请分配新的block到segment里面,而HW enqueue锁被用来管理推进HWM分配新空间时的串行操作. 显而易见,当高并发的insert发生时,甚至表中若有LOB字段时情况更糟,HWM的推进分配新空间的速度赶不上并发会话所需空间的速度时,就会发生在HW的enq上的等待. 解决思路: ?
这个等待事件通常说明会话在等待Undo Segment,注意等待的原因一般其实并不是因为UNDO TABLESPACE没有空间了,UNDO表空间不足会直接报ORA-30036(NOSPACEERRCNT). (编辑:ASP站长网) |