第六讲--buffer cache作用概述

Oracle数据库有三大文件:*.ctl、*.dbf、*.log。

 

块的概念:

Oracle把dbf文件分成一个个大小相等的块(block),块大小通常为8k。块是oracle进行IO的最小单位。块里面放的数据行,一个块里放多个数据行,一般而言,一个数据行不会被放在多个数据块里面。

当一个select语句要查询一行数据时,oracle通过计算定位到数据块。这个数据块里有20行数据,但是我们只访问其中一行,oracle向磁盘发出IO请求,请求一个数据块,操作系统会把整个块读到内存里去,CPU在块里面找到我们需要的数据行,然后返给用户。

我们只要一行数据但是oracle却把20行数据读到内存,这种做法仿佛很低效。其实不然,磁盘IO最耗费时间的部分是寻道时间,占整个IO过程的90%,我们从磁盘读20行数据到内存,耗费的时间与寻道时间相比少得多。而且程序具有局部性,其余的19行数据极可能在接下来执行过程中被访问,所以与其读一行数据不如多读一点。

段的概念:

一个表就是一个段。

区的概念:

物理上连续的块。建表(段)的时候oracle首先给段分配一个区,当第一个区用完之后,oracle会继续给段分配区。区是oracle给段分配空间的最小单位。

 

Buffer cache和*.dbf是对应的。Buffercache缓存的是dbf的数据,既然dbf被分为大小相等的块,那么buffer cache也被分成一个个的块。dbf里一个块叫做block,buffer cache里面一个块叫做buffer,block和buffer是一一对应的。

 

Buffer cache的意义:

1.      缓存dbf文件。buffer cache的命中率比shared pool的命中率更重要,buffer cache只要是没有命中,一定发生物理IO,物理IO必然寻道,这样的话性能很差;

2.      构造cr块;

 

什么是cr块?

一个会话修改的数据在commit之前,其他用户时看不到的。

Sqlplus1修改data row 1但是没有提交,然后sqlplus2来读块1,此时块1是不完整的,sqlplus2不能直接读块1。于是sqlplus2会在内存里面单独申请一个块,即块2。块1中没有修改的数据行(data row2)被直接填入块2,sqlplus2会把修改前的data row 1找出来填入块2。Sqlplus2去哪里找修改前的data row 1呢,oracle数据库里面有一堆名叫回滚(undo)的dbf文件,undo文件里面保存sqlplus1修改前的未提交的data row 1数据。Sqlplus2在undo文件里找到修改前的data row 1。2被称为cr。块1和块2都是buffer块。

第六讲--buffer cache作用概述_第1张图片

 

查看块大小:

SQL> show parameter block
 
NAME                                 TYPE
--------------------------------------------------------------------
VALUE
------------------------------
db_block_buffers                     integer
0
db_block_checking                    string
FALSE
db_block_checksum                    string
TRUE
db_block_size                        integer
8192
db_file_multiblock_read_count        integer
 
NAME                                 TYPE
------------------------------------ --------------------------------
VALUE
------------------------------
16
8192字节 = 8k

你可能感兴趣的:(第六讲--buffer cache作用概述)