ITL等待
& @: |& }' O& W0 j) i # Z6 a Y( y3 a$ h
发生等待的场景:+ D" J) b1 @, \8 ~
+ u5 t3 O: L9 ^' y% \& o5 f 1.超过maxtrans配置的最大ITL数
. B1 B, b# T$ P) P4 p4 u 9 c# G4 ^. G ?) s! m
2.initrans不足,没有足够的free space来扩展ITL& N3 {2 F) _2 t' D
8 C. j9 b6 v' @6 Z1 ~) {5 n/ F 解决方法:) R5 R& i( G+ W V' g0 u
: G; b7 @0 _7 y3 r& Y/ r6 D0 c
1.maxtrans不足:这一情况是由高并发引起的:同一数据块上的事务量: z: Z0 @1 z( S/ p, B& ?8 K
% y- L$ `* r8 ^1 V3 W 已经超出了其实际允许的ITL数。因此,要解决这类问题就需要从应用着手,% Q" D* s( d3 o, v j8 A
2 M% f% C! j& D% n 减少事务的并发量;长事务,在保证数据完整性的前提下,增加commit的频率,; M; B1 A; c! Y3 W0 |$ K1 V. M/ J
3 K9 K6 U' q0 u: b& l! R 修改为短事务,减少资源占用事件。而对于OLAP系统来说(例如,其存在高并发量3 @# Z" M8 ~+ E% @3 T" ]3 D9 Q
& Q8 a- y/ p% a% O, k
的数据录入模块),可以考虑增大数据块大小。5 o! L7 s! g# Y" S
# ?! P! C C2 D1 o L
2.initrans不足:数据块上的ITL数量并没有达到MAX TRANS的限制,( c% m# U( q- X) w7 g8 w* u
T% |4 @3 o i" A+ O( B 发生这种情况的表通常会被经常UPDATE,从而造成预留空间(PCTFREE)被填满。+ p8 N1 g2 @4 b" r9 j4 X
2 n! f0 r6 X) ^( L c 如果我们发现这类ITL等待对系统已经造成影响,可以通过增加表的INITRANS或者0 J# h! f0 l; H! B
o/ u7 T7 K5 h+ o. l( v2 s
PCTFREE来解决(视该表上的并发事务量而定,通常,如果并发量高,建议优先增加
6 M/ G' [! B8 Q3 A" w! H9 { 7 ^6 x% y$ E4 ?' ]
INITRANS,反之,则优先考虑增加PCTFREE)。3 s1 j. f% G; F# {1 g
( L( M$ k2 o; [& R" H 要注意的一点是,如果是使用ALTER TABLE的方式修改这2个参数的话,
& w7 X- R% Q* F% ~ 6 J4 O5 Y! R0 m5 i7 ^: ]: `
只会影响新的数据块,而不会改变已有数据的数据块--要做的这一点,需要将数据. u; ~8 R0 B" O1 ~* {
" Q9 U% [9 {) J+ i 导出/导入、重建表。, Y- B3 \5 f: P: f& U! {: L* a( O# z
- f- l8 n2 E7 J I8 E% D
ITL重用后如何实现前ITL读一致性:
2 a1 ~* [; h5 _1 i7 w/ i
% @; d+ Y7 n% L1 A& q+ F3 m( B ORACLE通过ITL条目中记录的回滚段地址找到回滚段,实现读一致性,如果事务已提交,
4 f" C! |% O i 6 m2 x- ~) }- Z# {0 K! c1 {
ITL就可以被重用,但是若前一个ITL被重用,前一个ITL的读一致性是如何实现的呢?
( C+ ?) b6 X5 [- a ' T3 o4 ~* ]$ d3 E4 `+ D. N% j7 o- X
假定block只有一个itl,假定第一个事务的时候产生了 ITL-0) e, g2 v# E1 ^% y' M
2 Z' H: j8 y3 _7 J' D7 u6 q: r! y Y) D
第二个事务来了,产生了 ITL-1 ,ITL-1 里面的UBA 可以找到回滚段地址,0 g3 e* d1 V: e1 r0 G
8 R1 e8 t/ X* q) I% A 回滚段中除了记录了 block用户数据的 before image 外还记录了 ITL-0 的信息。
! X% s! o! l! g
( I& C( t( P& E- S1 E' J* D 第三个事务来了,产生了 ITL-2 , ITL-2 中 UBA 指向回滚段,# l# ?; E" ?% r' m1 V5 R: u, v
' n1 J/ J m* ? 回滚段中也记录了 ITL-1 的信息。# T, N% L" H$ J7 o; T- K1 Q' Z
% |, f q+ i! Y/ M% w
这样当一个查询若需要ITL-0时候的信息,则找到当前block,发现是 ITL-2 ,
( b0 Q3 O5 x% x p9 i8 u Y
7 o, m7 e) `# u1 w+ `6 _ 根据UBA找到回滚段进行 roll 得到 变化前 block ,这个时候发现block中是 ITL-1 .% ~9 ]7 ?. r0 K! @+ R
1 a* i' m5 {1 P& y# N; ~
还不能满足需求。 于是再根据 ITL-1 中的 UBA 又去回滚段中找到数据来进行roll,
4 h% K, K/ Y' t5 M3 q' ?# {
* }8 a8 B" m) Q& ^6 p 得到一个block 数据,这个时候block中就有了 ITL-0.
; v! v6 o0 _' K- p/ S" b
6 e, J' ?' j* ?, K# E 通过根据当前ITL进行递归的方式找到数据,实现之前ITL的独一致性。 |