发表于: 2004.10.14 16:23
分类: Oracle is anything
出处: http://bitirainy.itpub.net/post/330/3100
---------------------------------------------------------------
答案是肯定的,假定一个extent=8block,一次IO正好是8 block,而block 1,3,6 在sga中,其他block不在sga中,当IO的时候,将会切割成
IO 1:block 2
IO 2: block 3,4,5
IO 3:block 7,8
我们可以设计一个实验,通过获得 dbms_rowid.ROWID_BLOCK_NUMBER(rowid) 找出指定 block 中数据的rowid,如下
select object_id,rowid from test where dbms_rowid.ROWID_BLOCK_NUMBER(rowid) = 59086;
182 AAAFOlAAEAAAObOAAA
183 AAAFOlAAEAAAObOAAB
184 AAAFOlAAEAAAObOAAC
185 AAAFOlAAEAAAObOAAD
186 AAAFOlAAEAAAObOAAE
187 AAAFOlAAEAAAObOAAF
188 AAAFOlAAEAAAObOAAG
189 AAAFOlAAEAAAObOAAH
190 AAAFOlAAEAAAObOAAI
191 AAAFOlAAEAAAObOAAJ
192 AAAFOlAAEAAAObOAAK
然后我们可以shutdown 数据库重新启动
设置 exec dbms_system.set_ev(266,12,10046,8,''); 跟踪session
然后查询指定rowid的记录比如 select * from test where rowid = 'AAAFOlAAEAAAObOAAE';
再做类似全表扫描的操作 select * from test;
这时我们可以观察到后面的查询的相同extent连续的block,原本可以在一次IO中完成,但是已经被割裂成多次IO了。
参考trace数据如下
查询1:
WAIT #3: nam='db file sequential read' ela= 15405 p1=4 p2=59086 p3=1
查询2:
WAIT #2: nam='db file scattered read' ela= 9591 p1=4 p2=59084 p3=2
WAIT #2: nam='db file scattered read' ela= 17551 p1=4 p2=59087 p3=4
由此可以看出,实际上SGA中存在少量离散的block可能导致IO次数的增加。











