人生就是如此
===========================================================
SGA中存在少量离散的block可能导致IO次数的增加
===========================================================
IO时若部分block已经在SGA中,这个时候对于已经在内存中的block显然是不需要IO了,但是oracle是怎么处理的呢?是割散成更小的IO单元吗?

答案是肯定的,假定一个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次数的增加。


bitirainy 发表于:2004.10.14 16:23 ::分类: ( Oracle is anything ) ::阅读:(842次) :: 评论 (6)
同意 [回复]

对,这个我上个月做实验的时候也发现了,如果内存中存在的话确实会分割I/O

wanghai 评论于: 2004.10.15 12:52
[回复]

这说明,oracle当FTS的时候,是先检查将要当前不存在于sga的连续block后请求IO的。 如果不进行检查而直接IO,那SGA中数据就没用处了。这是一个两难问题。

而事实上,对于FTS来说,一段extent只有少量block存在于SGA中或者说一个表存在于SGA中大量离散的block的概率值得我们考究。 如果一个表进行 索引范围扫描 ,然后进行全表扫描,假如表的数据有序性不好,那可能将导致很多的IO请求,但是接下来如果继续进行全表扫描则不存在先前的问题了。

不管怎么说,虽然我们觉得很别扭,但不可否认,这种处理方式效率还是很高的,因为检查一个块是否存在于sga中,只需要检查 block header 就可以了,也就是 block 的 hash table 。

biti_rainy 评论于: 2004.10.16 18:12
[回复]

这种IO次数的增加并不一定就表明效率会下降

kamus 评论于: 2004.10.18 20:08
[回复]

在相同的时间,这种IO次数的增加效率肯定会下降

liyongdong 评论于: 2004.10.31 19:14
kamus,如何证明你的说法 [回复]

这种IO次数的增加并不一定就表明效率会下降

?假如TEST表有1,2,3,4个块,并且连续,
2已经存在SGA中,这时候对TEST表做全表扫描,
跳过块2比全部扫描要快吗?

假若,存在于SGA的块数很多,并且都不是连续的,
那ORACLE会不会做全表扫描(覆盖存在SGA的数据)
来避免多次跳跃?

若存在这种说法,那ORACLE又是如何判定何时
需要跳跃,何时全表扫描?

zalbb 评论于: 2005.02.17 11:09
[回复]

存在于sga中的数据会使得 io 不连续,也就是本来一次io可以读取更多的数据,如今却可能被分割成多个io。

这也是全表扫描,不过不是你所说的 覆盖存在于 sga中的数据,只不过是io次数增加了。

biti_rainy 评论于: 2005.02.17 17:06

发表评论
标题

在此添加评论
表情符号: smile laughing tongue angry crying sad wassat wink

称呼

邮箱地址(可选)

个人主页(可选)




切换风格
新闻聚合
博客日历
文章归档...
最新发表...
博客统计...
Blog信息
网站链接...