您的位置:首页 > Web前端

第六讲--buffer cache作用概述

2016-03-21 19:30 381 查看
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块。



查看块大小:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: