先来张大图:
所用SQL语句:
BYS@ ocm1>select dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid) block#,deptno from bys.test;
FILE# BLOCK# DEPTNO
---------- ---------- ----------
4 391 10
就以上图为例,文字描述分析一下前台进程发出查询语句时获取所需数据块的过程:
注:本文不涉及SQL语句的解析部分、客户端与服务器交互等,只涉及buffer cache。
这里的物理读是非直接路径读、非大表全表扫描--此点最后会有介绍。
如果发出的是更新语句,只是在buffer pin上所加的锁为X独占锁,其它步骤基本一致。
本文的例子只读取了一个数据块。
从buffer cache中读取一个数据块一般需要100ns左右,从一般的存储硬盘中读取一个数据块需要10ms;所以大概算一下,从内存中读取数据块比从硬盘中快近十万倍。
故oracle在读取数据块时,先在buffer cache中查找,如存在,则读取--逻辑读;如果数据块不存在,则发生物理读,从物理文件中将数据读入buffer cache(不考虑直接读的情况)。
之前写过的逻辑读的: 数据读取之逻辑读简单解析--关于BUFFER CACHE
时间: 2024-09-15 01:27:19