Oracle关于快速缓存区应用原理
为什么oracle可以对于大量数据进行訪问时候能彰显出更加出色表现,就是通过所谓的快速缓存来实现数据的快速运算与操作。在之前的博文中我已经说过sql的运行原理,当我们訪问数据库的数据时候,首先不是从数据文件里去查询这个数据,而是从数据快速缓存中去查找,而没有这个必要再去查询磁盘中的数据文件了。
仅仅有在数据缓存中没有这个数据的时候,数据库才会从数据文件里去查询(这样做的目的就是提高读取的速度,由于读取内存的速度远比读取磁盘的速度快好多倍)。
有了这样的机制就能提高数据库的总体效率。
这样的机制固然提高了数据库的訪问效率,可是我们不禁会问数据库是怎样实现数据文件和快速缓存的一致性的那?在弄清这个问题之前我们先来看一下oracle的体系结构。
在oracle中。oracle的体系结构是有内存结构和进程结构共同组成:
由此可见我们所要研究的数据快速缓存是SGA一部分,那么我们就来说一下SGA的数据结构:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
第一部分:数据缓存区
数据缓存区就是我们将数据库文件的数据存放的缓存。它用来保存从数据文件里读取近期的数据块信息。当中的数据被全部用户享用。数据缓存区有很多大小同样的缓存块组成,这些缓存块大致能够分为3类:
一、 空暇缓存块
当我们又一次启动数据库后。系统就会为数据库分配一些空暇的缓存块。
空暇缓存块中是没有不论什么数据的,他们在等待后台进程或server进程向当中写入数据。当Oracle
数据库从数据文件里读取数据后,数据库就会寻找是否有空暇的缓存块,以便将数据写入当中。
一般来说。数据库在启动的时候,就会在内存中预先分配这些缓存块。
所以,Oracle数据库在启动的时候,会占用比較多的内存(这个内存空间是能够设置的)。可是,这能够免去在实际须要时向内存申请的时间。所以,有时候Oracle数据库尽管已启动,内存的占用率就非常高。可是。其兴许仍然能够正常执行的原因。而其它数据库尽管刚启动的时候内存占用率不是非常高,可是。但系统内存到达80%以上时,在进行数据处理就会受到明显的影响。
所以,当我们利用SELECT语句从数据库文件里读取文件的时候,数据库首先会寻找是否有空暇的缓存。
二、命中缓存块
命中缓存块保存那些正在使用的数据。
当select语句先从数据库文件里读取数据后,会把取得的数据放入到这个命中缓存块中。
直到快速缓存消耗完成等原因,这个空间才会被释放。如此下次假设再次訪问同样的数据的时候就能够从这里进行查找,节省时间(由于仅仅是被select。因此这里的数据是不会换出内存)。
三、脏缓存块
脏缓存块保存已经被改动可是还没有被写入数据库文件的数据。当訪问完数据之后。由空暇缓存块标志转化为命中缓存块标志。当我们运行update这类带侵略性的操作的时候,我们要先去命中缓存区去寻找数据,假设存在就行直接操作。而且此时命中缓存区标志被转为脏缓存块标志。这样就行实现数据的一致性。当满足一定的条件时。这些脏缓存块中的数据内容会被写入到数据库文件里去,以便永久性的保留数据库改动记录。
当写入数据库之后脏缓存块标志就会转化为空暇缓存块。
那Oracle数据库关于实现三大缓存块标志转化的原理:
实现以上机制主要靠两个列表:1.近期最少使用列表(LRU列表); 2.写入列表(DIRTY表).当中LRU列表保存着所有空暇缓存块、命中缓存块和所有还没有被移入到DIRTY列表中的脏缓存块。
当Oracle数据库用户在查询数据的时候。可能会遇到例如以下情况:
1、查询数据时。数据库首先在LRU列表中查询是否有空暇缓存块。其查询的数据是从尾部開始查找。当查找有空暇的缓存块时,数据库就会把查到的数据写入到这个空暇缓存中。
2、若数据库在查询的时候。首先查到的是脏缓存的话,则会把这个脏缓存移动到DIRTY列表中。然后再继续查询。直到查询到合适的空暇缓存块为止(查询的时候数据发生变动)。
3、若数据库在LRU列表中,从尾到头查了一遍(忽略oracle的查找算法)。没有找到空暇缓存块,或者尽管有空暇缓存块,可是其容量不符合要求时,数据库就会临时结束这一次查找。然后,系统就会触发数据库写进程,把DIRTY列表中的脏缓存块写入到数据库中去。已经被写入到数据库文件里去的脏缓存块将又被数据库标记为空暇缓存块。并插入到LRU列表中。当数据库运行完成这个动作之后。数据库又会对LRU列表进行搜索,找到合适的数据快速空暇缓存之后,就会把读取的数据写入到这个空暇缓存中。
第二部分:重做日志快速缓存
用于记录数据库发生改变的信息。这些变化可能是DML或者DDL。关于DML和DDL我已经描写叙述过。
第三部分:共享池
主要包含库缓存、数据字典缓存以及用于存储并行操作信息和控制结构的缓存
库缓存:解析用户进程提交的SQL语句或者pl/sql程序和保存近期解析过的程序;
数据字典缓冲区:保存数据库对象的信息,包含用户账号信息、数据文件名称、段名、表说明、权限等。
第四部分:JAVA池
主要为JAVA命令提供语法解析(用不到JAVA命令无需配置)。
第五部分:大池
数据库管理员配置的可选内存区域。用于分配大量的内存,处理比共享池更大的内存。须要处理的操作有:数据库备份与恢复;运行并行化的数据库操作;具有大量排序的sql等。
Oracle关于快速缓存区应用原理的更多相关文章
- 聊聊高并发(三十四)Java内存模型那些事(二)理解CPU快速缓存的工作原理
在上一篇聊聊高并发(三十三)从一致性(Consistency)的角度理解Java内存模型 我们说了Java内存模型是一个语言级别的内存模型抽象.它屏蔽了底层硬件实现内存一致性需求的差异,提供了对上层的 ...
- 关系型数据库工作原理-快速缓存(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...
- sed原理及sed命令格式 ,缓存区,模式空间
4.1 Sed工作原理 sed是一个非交互式的流编辑器.所谓非交互式,是指使用sed只能在命令行下输入编辑命令来编辑文本,然后在屏幕上查看输出:而所谓流编辑器,是指sed每次只从 ...
- ACM/ICPC 之 优先级队列+设置IO缓存区(TSH OJ-Schedule(任务调度))
一个裸的优先级队列(最大堆)题,但也有其他普通队列的做法.这道题我做了两天,结果发现是输入输出太过频繁,一直只能A掉55%的数据,其他都是TLE,如果将输入输出的数据放入缓存区,然后满区输出,可以将I ...
- 为 Python Server Pages 和 Oracle 构建快速 Web 开发环境。
为 Python Server Pages 和 Oracle 构建快速 Web 开发环境. - 在水一方 - 博客频道 - CSDN.NET 为 Python Server Pages 和 Oracl ...
- Linux页快速缓存与回写机制分析
參考 <Linux内核设计与实现> ******************************************* 页快速缓存是linux内核实现的一种主要磁盘缓存,它主要用来降低 ...
- node(Buffer缓存区)
// 创建buffer类 var buf=new buffer(10); var buf=new buffer([10,20,30,40]); var buf=new buffer("www ...
- ThinkPHP中的动态缓存(S方法)和快速缓存(F方法)
系统默认的缓存方式是采用File方式缓存,我们可以在项目配置文件里面定义其他的缓存方式,例如,修改默认的缓存方式为Xcache(当然,你的环境需要支持Xcache) 对于File方式缓存下的缓存 ...
- 清除oracle中的缓存(具体细节未知, 慎用)
oracle中的缓存主要是指SGA中的:1.share pool2.database buffer cache清空命令如下:首先要登录到sqlplus命令下,输入如下命令即可:SQL> alte ...
随机推荐
- linux之ssh命令
ssh命令用于远程登录上Linux主机. 常用格式:ssh [-l login_name] [-p port] [user@]hostname更详细的可以用ssh -h查看. 不指定用户: ssh 1 ...
- Android kernel Crash后,定位出错点的方法
转载:http://blog.csdn.net/wlwl0071986/article/details/11635749 1. 将/prebuild/gcc/linux-x86/arm/arm-lin ...
- Java实现中文算数验证码(算数运算+-*/)
原文:http://blog.csdn.net/typa01_kk/article/details/45050091 /** * creat verification code * */ @Actio ...
- DELPHI7下SUPPEROBJECT遍历子对象的name和value
DELPHI7下SUPPEROBJECT遍历子对象的name和value var ite: TSuperAvlIterator; while ite.MoveNext do begin if ite. ...
- Android反编译调试源码
Android反编译调试源码 1. 反编译得到源码 直接在windows 命令行下输入命令java -jar apktool_2.0.0.jar d -d 小米运动_1.4.641_1058.apk ...
- log4j教程 6、Logger方法
Logger类提供了多种方法来处理日志活动. Logger类不允许实例化一个新的记录器实例,但它提供了两个静态方法获得一个 Logger 对象: public static Logger getRoo ...
- [转载]Process工具类,提供设置timeout功能
FROM:http://segmentfault.com/blog/lidonghao/1190000000372535 在前一篇博文中,简单介绍了如何使用Process类来调用命令行的功能,那样使用 ...
- iptables 使用场景
25 Most Frequently Used Linux IPTables Rules Examples by RAMESH NATARAJAN on JUNE 14, 2011 At a firs ...
- 2017.4.26 慕课网--Java 高并发秒杀API配置文件(持续更新)
新建项目,new maven project. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...
- dubbo接口压测工具stresstester使用
dubbo接口压测工具stresstester使用 https://blog.csdn.net/u013822349/article/details/79412719