为什么oracle能够对于大量数据进行访问时候能彰显出更加出色表现,就是通过所谓的高速缓存来实现数据的高速运算与操作。在之前的博文中我已经说过sql的执行原理,当我们访问数据库的数据时候,首先不是从数据文件中去查询这个数据,而是从数据高速缓存中去查找,而没有这个必要再去查询磁盘中的数据文件了。只有在数据缓存中没有这个数据的时候,数据库才会从数据文件中去查询(这样做的目的就是提高读取的速度,因为读取内存的速度远比读取磁盘的速度快好多倍)。有了这种机制就能提高数据库的整体效率。

这种机制固然提高了数据库的访问效率,但是我们不禁会问数据库是如何实现数据文件和高速缓存的一致性的那?在弄清这个问题之前我们先来看一下oracle的体系结构。

在oracle中,oracle的体系结构是有内存结构和进程结构共同组成:

由此可见我们所要研究的数据高速缓存是SGA一部分,那么我们就来说一下SGA的数据结构:

第一部分:数据缓存区

数据缓存区就是我们将数据库文件的数据存放的缓存,它用来保存从数据文件中读取最近的数据块信息,其中的数据被所有用户享用,数据缓存区有许多大小相同的缓存块组成,这些缓存块大致可以分为3类:

一、 空闲缓存块

当我们重新启动数据库后,系统就会为数据库分配一些空闲的缓存块。空闲缓存块中是没有任何数据的,他们在等待后台进程或服务器进程向其中写入数据。当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等。

本文转自:https://blog.csdn.net/wanghjbuf/article/details/50809343

Oracle关于高速缓存区应用原理相关推荐

  1. oracle 开始一个事务,oracle的启动与关闭原理-事务commit或者rollback

    oracle的启动与关闭原理-事务commit或者rollback 4.事务 4.1事务的概念 从第一个DML语句开始执行,以rollback或者commit为结束标记,之前所有的DML操作(inse ...

  2. oracle闪回 分区,Oracle 闪回区(Oracle Flash recovery area)

    闪回区已经有了好几载的岁月了,在10g的时候就被推出一直延续到现在.Oracle闪回区是为RMAN准备的,尽管抛开它我们可以同样完成数据库备份恢复的相关工作,Oracle依旧强烈推荐使用且它让其成为R ...

  3. [译] 沙箱中的间谍 - 可行的 JavaScript 高速缓存区攻击

    原文 The Spy in the Sandbox – Practical Cache Attacks in Javascript 相关论文可在 https://github.com/wyvernno ...

  4. oracle11g创建闪回分区多大,Oracle闪回区大小预估

    一个朋友问如何设置Oracle闪回区大小,有什么依据没有. 查证官方文档,有如下描述 For example, if you intend to setDB_FLASHBACK_RETENTION_T ...

  5. Oracle闪回报错,oracle 闪回区满了,ORA-19815

    oracle 闪回区满了,查看日志报错:ORA-19815,命令行输入:sqlplus / as sysdba startup  mount   //如果你的数据库出现了无法连接的情况时,可以加上这句 ...

  6. PN结空间电荷区形成原理

    PN结空间电荷区形成原理  杂质半导体中的多子一般都是由杂质原子提供,少子是本征激发产生 P型半导体和n型半导体结合后,交界处p区的多子(空穴)向n区扩散,n区多子(电子)向p区扩散 前者是因为n区的 ...

  7. java+cache使用方法_JVM代码缓存区CodeCache原理及用法解析

    一. CodeCache简介 从字面意思理解就是代码缓存区,它缓存的是JIT(Just in Time)编译器编译的代码,简言之codeCache是存放JIT生成的机器码(native code).当 ...

  8. oracle 数据库 pga,Oracle程序大局区(PGA)

    Oracle程序全局区(PGA) 下图是共享服务器模式和专用服务器模式下,PGA.UGA的不同情况 下面是专有模式的pga图: 注:上图sort area是属于pga,SORT_AREA_RETAIN ...

  9. Oracle 反向键索引的原理和用途(减少索引热点块)

    Oracle 反向键索引的原理和用途(减少索引热点块) 我们知道Oracle会自动为表的主键列建立索引,这个默认的索引是普通的B-Tree索引.对于主键值是按顺序(递增或递减)加入的情况,默认的B-T ...

最新文章

  1. Hadoop数据仓库工具——Hive
  2. 安装Adventure Works 2008 R2演示数据库
  3. 最新PC游戏下载链接
  4. 为什么买入不了创业版_详解实战抄底——如何抄到下引线的最底端。及妖股的首板买入点...
  5. 如何获得完美的调色板?完美的配色素材专辑拿走!
  6. UVA 10340 - All in All
  7. LAMP架构(LAMP介绍,mysql/mariaDB介绍,Mysql安装)
  8. 深入Atlas系列:客户端网络访问基础结构(上) - WebRequest的工作流程与生命周期...
  9. erp系统原理和实施第五版pdf_ERP系统实施费用!
  10. 在ashx文件中使用Session
  11. PHP在线预览word文档的功能
  12. guid主分区表损坏如何处理_【硬盘分区表错误】硬盘分区表错误原因_硬盘分区表损坏...
  13. 南水北调中线调水量仅占丹江口水库水量1/4
  14. 基于IPFS视频存储的在线视频网站
  15. 在PPT中插入LaTeX公式(不用mathtype的方法,亲测有用!)
  16. Windows下对文件夹下所有图片批量重命名(附C++,python,matlab代码)
  17. Exception类
  18. python字符串算式加减运算(Python字符串运算)
  19. KNN 及 matplotlib 数据归一化
  20. php mql获取结果集,mql查询删除更新嵌入求指导php

热门文章

  1. INPHIC英菲克_全志a31s芯片_android4.4.2_root_当贝桌面线刷固件包
  2. [转载]校园背景音乐
  3. [POI2008]Tro
  4. 黑莓z10 android,重生还是毁灭——黑莓Z10使用评测
  5. Radmin密码破解
  6. 经常使用npm命令,但你真的知道它是什么意思吗?
  7. springboot批量更新实体_Spring Batch批量处理支付宝账单实践-基础篇
  8. React fetch请求方式
  9. HTTP的WEB服务器做了些什么?
  10. RTMP 推流增加对H265的支持