數據庫中頻繁出現會話等待(dbfile sequential read),一張大表135G上面創建有四個單列索引,經查詢確認此等待(dbfile sequential read)是由於一條insert語句引起,按照常理來說 insert和db filesequential read等待是兩個完全不搭邊的,經分析是由於表上的索引引起,表在進行insert 時,索引也在同時進行維護更新,需要查詢索引塊確認索引更新位置,當併發量很大時,將會發生此等待。以下是在測試環境中所做的測試。
創建測試表t2
create table t2(c1 number,c2number,c3 number);
創建多個索引,以方便模擬等待事件的發生,同時制定pctfree值爲0 ,這樣索引更容易發生分裂
create index ind_t2_c1 on t2(c1) pctfree 0;
create index ind_t2_c2 on t2(c2)pctfree 0;
create index ind_t2_c3 on t2(c3)pctfree 0;
create index ind_t2_c1c2 on t2(c1,c2)pctfree 0;
create index ind_t2_c1c2c3 on t2(c1,c2,c3)pctfree 0;
初始化數據插入
begin
for i in 1..1000000
loop
insert into t1 values(i,i+1,i+2);
end loop;
commit;
end;
/
然後我們打開10046 會話跟蹤,
alter session set events '10046 trace namecontext forever,level 12';
往表中插入大量數據
begin
for i in 50000..200000
loop
insert into t1 values(i,i+1,i+2);
end loop;
commit;
end;
/
待插入完成後,關閉10046
alter session setevents '10046 trace name context off';
查看trace文件
PARSING IN CURSOR #6len=97 dep=0 uid=90 oct=47 lid=90 tim=1387231767091421 hv=2257850176ad='36ebcc78' sqlid='3h55s3f3983u0'
begin
for i in 50000..200000
loop
insert into t1 values(i,i+1,i+2);
end loop;
commit;
end;
END OF STMT
PARSE#6:c=7000,e=6832,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,tim=1387231767091408
BINDS #6:
=====================
PARSING IN CURSOR #5len=41 dep=1 uid=90 oct=2 lid=90 tim=1387231767092758 hv=3483989809ad='3ce9466c' sqlid='d4pp1yg7ukxtj'
INSERT INTO T1 VALUES(:B1,:B1 +1,:B1 +2)
END OF STMT
PARSE#5:c=0,e=687,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=1,tim=1387231767092747
BINDS #5:
Bind#0
oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00pre=00
oacflg=03 fl2=206001 frm=00 csi=00 siz=72off=0
kxsbbbfp=0057ffb8 bln=22 avl=02 flg=05
value=50000
Bind#1
oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00pre=00
oacflg=03 fl2=206001 frm=00 csi=00 siz=0off=24
kxsbbbfp=0057ffd0 bln=22 avl=02 flg=01
value=50000
Bind#2
oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00pre=00
oacflg=03 fl2=206001 frm=00 csi=00 siz=0off=48
kxsbbbfp=0057ffe8 bln=22 avl=02 flg=01
value=50000
WAIT #5:nam='db file sequential read' ela= 23409 file#=4 block#=1799 blocks=1obj#=72576 tim=1387231767131489
WAIT #5:nam='db file sequential read' ela= 1103 file#=4 block#=1800 blocks=1 obj#=72576tim=1387231767134290
WAIT #5:nam='db file sequential read' ela= 21198 file#=14 block#=2689 blocks=1obj#=72583 tim=1387231767155970
WAIT #5:nam='db file sequential read' ela= 14040 file#=4 block#=1900 blocks=1obj#=72583 tim=1387231767170334
WAIT #5:nam='db file sequential read' ela= 19055 file#=14 block#=3280 blocks=1obj#=72584 tim=1387231767189656
WAIT #5:nam='db file sequential read' ela= 20841 file#=4 block#=2328 blocks=1obj#=72584 tim=1387231767210672
WAIT #5:nam='db file sequential read' ela= 17894 file#=14 block#=5377 blocks=1obj#=72585 tim=1387231767228877
從以上信息可以明顯看到'dbfile sequential read'等待,等待的信息爲:
file#=4 block#=1799blocks=1 obj#=72576
我們確認下obj#=72576,是什麼
orcl@ SCOTT>select object_name,object_id fromdba_objects where object_id=72576;
OBJECT_NAME OBJECT_ID
----------------------------------------
IND_T1_C3 72576
Elapsed: 00:00:00.12
orcl@ SCOTT>select object_name,object_id fromdba_objects where object_id=72583;
OBJECT_NAME OBJECT_ID
----------------------------------------
IND_T1_C1C2 72583
Elapsed: 00:00:00.03
orcl@ SCOTT>select object_name,object_id fromdba_objects where object_id=72584;
OBJECT_NAME OBJECT_ID
----------------------------------------
IND_T1_C1C2C3 72584
可以看到全都是索引。