过着简单,真实的生活,喜欢收藏变形金刚(TFE,G1,SL系列),研究金融股市,KOF98,篮球,学习研究Oracle技术,我并不是一个全职的Oracle DBA,但是对于Oracle技术的热爱和研究,是一个不争的事实,愿意结交广大Oracle技术爱好者!MSN:oracle_kof_tf@hotmail.com
Logical Read notes
上一篇 /
下一篇 2008-03-12 15:15:27
/ 个人分类:Oracle Reminder
Extent是
Oracle数据库段级扩展的最小单位,而block是数据库I/O读写的最小单元,当我一个用户执行select或者带有predicate的DML语句的时候,他所期望得到的不是数据块而是块中所存储的行,一个块到底能存储多少行呢?在之前写过的一篇文章(http://space.itpub.net/12361284/viewspace-173547)中已经有详细的说明,当然还可以参考(http://www.sosdb.com/article/datafile_block.htm)对数据块的物理结构有个详细的介绍。所以这里就不详述了,对于一个8K的block来讲,除去一些基本的block header的开销以及将pctfree为0等因素考虑在内,数据表中的每一行在block中占据的
空间最少也要11个字节,因此一个8k的block中,最多可以存储大约736行的数据。
参考了这篇文章
http://space.itpub.net/13095417/viewspace-201868
学习并记录一下:
一个用户session如果希望从block里面获取数据行,首先会在session对应的UGA中分配内存,创建并打开一个cursor以发出
sql语句. 这个SQL首先会在共享池中生成执行计划,并且开始数据行的获取过程,
server process会根据相应的查询条件将行所在的
data block从数据文件中读入buffer cache.这个过程就叫做物理读,那么每次物理读的数量是和一个参数相关的db_file_multiblock_read_count,当block被server process读入buffer cache后,就开始了从block中读取行的过程,这个过程就叫逻辑读,为了完成一次逻辑读,server process首先会根据PID的hash算法,在buffer cache中定位一个hash bucket,并获得bucket上cache buffer chains上的latch,获得latch成功后,开始在chain上去需要指定的buffer header,并最终定位到buffer cache中的block并在块上加一个pin锁,之后释放chain上的latch,然后就开始进行行数据的读取了,首先服务器并不会一次把所有满足predicate条件的行从blocks中一次读出,这样做的话,对于PGA的压力会比较的大,那么这个一次读出行的数量是由client的程序条件来指定的,比如sqlplus中的arraysize,这个参数就限定了sqlplus这个应用一次可以从buffer cache中的block抓取多少行。这个值默认是15,在这些行取出之后,会经由PGA再传给客户端用户,需要注意的是数据行一旦从buffer cache中读出,oracle就会释放在原有block上加的pin锁,这就算一次逻辑读的完成。因此可以这样理解server process每申请一次cache buffer chain latch,就算做是一次逻辑读。
导入论坛
引用链接
收藏
分享给好友
推荐到圈子
管理
举报
TAG: