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
------------------------------
168192字节 = 8k
Oracle数据库的Buffer Cache用于缓存.dbf文件,提高IO效率。块是IO最小单位,Buffer Cache中的Buffer与块一一对应。Buffer Cache的意义在于减少物理IO,提供数据一致性,通过CR块确保未提交修改对其他会话不可见。此外,Buffer Cache的命中率对性能至关重要。

7680

被折叠的 条评论
为什么被折叠?



