ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Logical Read notes

Logical Read notes

原创 Linux操作系统 作者:oracle_ace 时间:2008-03-12 15:15:27 0 删除 编辑
      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,就算做是一次逻辑读。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12361284/viewspace-204117/,如需转载,请注明出处,否则将追究法律责任。

上一篇: UGA的概念
请登录后发表评论 登录
全部评论

注册时间:2007-12-10

  • 博文量
    284
  • 访问量
    796870