为什么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关于快速缓存区应用原理的更多相关文章

  1. 聊聊高并发(三十四)Java内存模型那些事(二)理解CPU快速缓存的工作原理

    在上一篇聊聊高并发(三十三)从一致性(Consistency)的角度理解Java内存模型 我们说了Java内存模型是一个语言级别的内存模型抽象.它屏蔽了底层硬件实现内存一致性需求的差异,提供了对上层的 ...

  2. 关系型数据库工作原理-快速缓存(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...

  3. sed原理及sed命令格式 ,缓存区,模式空间

    4.1            Sed工作原理 sed是一个非交互式的流编辑器.所谓非交互式,是指使用sed只能在命令行下输入编辑命令来编辑文本,然后在屏幕上查看输出:而所谓流编辑器,是指sed每次只从 ...

  4. ACM/ICPC 之 优先级队列+设置IO缓存区(TSH OJ-Schedule(任务调度))

    一个裸的优先级队列(最大堆)题,但也有其他普通队列的做法.这道题我做了两天,结果发现是输入输出太过频繁,一直只能A掉55%的数据,其他都是TLE,如果将输入输出的数据放入缓存区,然后满区输出,可以将I ...

  5. 为 Python Server Pages 和 Oracle 构建快速 Web 开发环境。

    为 Python Server Pages 和 Oracle 构建快速 Web 开发环境. - 在水一方 - 博客频道 - CSDN.NET 为 Python Server Pages 和 Oracl ...

  6. Linux页快速缓存与回写机制分析

    參考 <Linux内核设计与实现> ******************************************* 页快速缓存是linux内核实现的一种主要磁盘缓存,它主要用来降低 ...

  7. node(Buffer缓存区)

    // 创建buffer类 var buf=new buffer(10); var buf=new buffer([10,20,30,40]); var buf=new buffer("www ...

  8. ThinkPHP中的动态缓存(S方法)和快速缓存(F方法)

    系统默认的缓存方式是采用File方式缓存,我们可以在项目配置文件里面定义其他的缓存方式,例如,修改默认的缓存方式为Xcache(当然,你的环境需要支持Xcache)    对于File方式缓存下的缓存 ...

  9. 清除oracle中的缓存(具体细节未知, 慎用)

    oracle中的缓存主要是指SGA中的:1.share pool2.database buffer cache清空命令如下:首先要登录到sqlplus命令下,输入如下命令即可:SQL> alte ...

随机推荐

  1. 磁盘爆满导致MySQL无法启动:Disk is full writing './mysql-bin.~rec~' (Errcode: 28). Waiting for someone to free space...

    今天收到监控邮件说博客访问失败.打开页面一看,硕大的502 Bad Gateway,ping了一下VPS发现是通的,SSH连接上去看了下Nginx日志发现没问题,重启lnmp的时候发现Mysql起不来 ...

  2. Java:集合类的区别详解

    Java中集合类的区别 Array是数组,不在集合框架范畴之内,一旦选定了,它的容量大小就不能改变了,所以通常在编程中不选用数组来存放. 集合 : 集合对象:用于管理其他若干对象的对象 数组:长度不可 ...

  3. json字符串与java对象互转

    在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML.JSON等,JSON作为一个轻量级的数据格式比xml效率要高,XML需要很多的标签,这无疑占据了网络流量,JSON在这方面则做的很好, ...

  4. 新人补钙系列教程之:体验ApplicationDomain 应用程序域

    要说应用程序域,就不得不说安全沙箱 安全沙箱在帮助文档的解释是: 客户端计算机可以从很多来源(如外部 Web 站点或本地文件系统)中获取单个 SWF 文件.当 SWF 文件及其它资源(例如共享对象.位 ...

  5. ElasticSearch 检索文档

    1.检索文档 现在Elasticsearch中已经存储了一些数据,我们可以根据业务需求开始工作了.第一个需求是能够检索单个员工的信息. 这对于Elasticsearch来说非常简单.我们只要执行HTT ...

  6. Python开发easy忽略的问题

    这篇文章主要介绍了Python程序猿代码编写时应该避免的17个"坑",也能够说成Python程序猿代码编写时应该避免的17个问题,须要的朋友能够參考下 一.不要使用可变对象作为函数 ...

  7. JStorm的Metrics含义

    附录:Metrics含义 MemoryUsed cluster/topology/worker使用到的物理内存HeapMemory cluster/topology/worker JVM使用到的堆内存 ...

  8. 转:MVVM的基本入门简介

    https://mp.weixin.qq.com/s?__biz=MzA3MjA4NjE3NQ==&mid=404502568&idx=1&sn=fe512f9820b99d3 ...

  9. 倍福TwinCAT(贝福Beckhoff)基础教程2.2 TwinCAT常见类型使用和转换_指针

    定义pt为指向INT类型的指针,在程序中取得var_int1的地址(INT类型),然后将地址对应的数据还原给var_int2(pt^的写法)     更多教学视频和资料下载,欢迎关注以下信息: 我的优 ...

  10. How to Check some table was locked

    select * from sys.sysprocesses where blocked<>0  看看waittime是不是很大  kill spid