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 ...
随机推荐
- 关于使用ueditor时候遇到的情况
在使用百度ueditor的时候遇到的一下情况 1.点击图片之后图片无法在编辑器内显示 2.从数据库取出图片的时候无法在编辑器内显示 3.内容存放入数据库取出来之后,HTML效果不显示 流程: 1.引入 ...
- mysql优化30条建议
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- jstat命令的使用及VM Thread分析
http://www.javatang.com/archives/2017/10/20/12131956.html 前面提到了一个使用jstack的shell脚本,通过命令可以很快地定位到指定线程对应 ...
- 对中级 Linux 用户非常有用的 20 个命令
FROM:http://www.oschina.net/translate/20-advanced-commands-for-middle-level-linux-users 21. 命令: Find ...
- CodeForces 388A Fox and Box Accumulation (模拟)
A. Fox and Box Accumulation time limit per test:1 second memory limit per test:256 megabytes Fox Cie ...
- Android模块编译过程中的错误no rules to make target
今天花了不少时间在纠正一个编译错误: make: *** No rule to make target `out/target/common/obj/JAVA_LIBRARIES/sqlite-jdb ...
- 在HTML页面中实现一个简单的Tab
参考:http://blog.sina.com.cn/s/blog_6cccb1630100m23i.html HTML页面代码如下: <!DOCTYPE html PUBLIC "- ...
- 读jQuery源码之整体框架分析
读一个开源框架,大家最想学到的就是设计的思想和实现的技巧.最近读jQuery源码,记下我对大师作品的理解和心得,跟大家分享,权当抛砖引玉. 先附上jQuery的代码结构. (function(){ / ...
- 编辑mac系统环境变量后保存,提示没有权限用到下面这个命令
编辑的文件是vim /etc/paths :w !sudo tee % %代表当前编辑文件名 MAC:查看端口占用情况: lsof -i tcp: list open files lsof -i 用以 ...
- 【BZOJ4008】【HNOI2015】亚瑟王 概率DP
链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...