第六讲--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块。
查看块大小:
块的概念:
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
相关文章推荐
- jstorm源码之RotatingMap
- CSS选择器的兼容性
- jstorm源码之 RichSpoutBatchExecutor
- JavaScript自学之数组排序
- threejs贴图的几个问题
- css:图标与文字对齐的两种方法
- CSS2系列:外边距合并问题(margincollapse)
- Nodejs 如何制作命令行工具
- U盘fedora无法启动
- 利用 jQuery iframe 标签实现无刷新上传
- JS处理日期时间戳
- Offer题1~3 重载=&指针和数组&二维数组替换
- 段焱--web前端开发须知规范
- 在Bootstrap的Modal form里面添加PartialView
- SharedPreferences使用详解
- javaScript"闭包" - (实例理解)
- jquery 操作 select
- 解决了jQuery插件未能导入到项目之中
- 普元Js将页面输入框改为查看显示
- HTML5 元素