Oracle数据库处理SQL都会经过三个过程:解析(parse)、执行(exec)、返回结果(fetch)。为了便于理解,我们首先省略的SQL的处理过程,
Oracle数据库处理SQL都会经过三个过程:解析(parse)、执行(exec)、返回结果(fetch)。为了便于理解,我们首先省略的SQL的处理过程,,而直接介绍数据块的读取或修改过程。
物理读和逻辑读概念
1.对要访问的块地址做HASH
HASH(FILE#,BLOCK#) = hash_value(HV)
2.根据HV找到对应的HASH bucket
3.搜索bucket中的HASH chain链表,比对chain上的buffer_header(BH).
逻辑读
1.找到BH后,读取BH中的(buffer_address)BA
2.根据BA访问buffer_cache中的目标buffer.
物理读
1.搜遍hash_chain上的BH都没有找到目标BH
2.从DBF中加载block到buffer中.
3.并将buffer头链入对应的BUCKET中的hash chain上.
4.访问buffer.
latch和pin
buffer_cache中的buffer对每个server_process而已都是公有资源谁都可以读,谁都可以改,为保证这些链不被并发修改导致破坏。oracle采用latch和buffer_pin锁来控制对内存结构体使用时的并发。
CBC latch
某个服务器进程在chain上搜索BH时,另一个进程要做入链出链的操作,对于一个buffer,两个进程同时都要去做出入链,内存则没有安全保证。为保证这些链不被并发修改导致破坏
例如:我在搜索链表上的buffer_