zoukankan      html  css  js  c++  java
  • Oracle关于快速缓存区应用原理


            为什么oracle可以对于大量数据进行訪问时候能彰显出更加出色表现,就是通过所谓的快速缓存来实现数据的快速运算与操作。在之前的博文中我已经说过sql的运行原理,当我们訪问数据库的数据时候,首先不是从数据文件里去查询这个数据,而是从数据快速缓存中去查找,而没有这个必要再去查询磁盘中的数据文件了。

    仅仅有在数据缓存中没有这个数据的时候,数据库才会从数据文件里去查询(这样做的目的就是提高读取的速度,由于读取内存的速度远比读取磁盘的速度快好多倍)

    有了这样的机制就能提高数据库的总体效率。

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

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


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


    第一部分:数据缓存区

    数据缓存区就是我们将数据库文件的数据存放的缓存。它用来保存从数据文件里读取近期的数据块信息。当中的数据被全部用户享用。数据缓存区有很多大小同样的缓存块组成,这些缓存块大致能够分为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等。

  • 相关阅读:
    centos下搭建多项目svn服务器
    LAMP环境的搭建(三)----PHP7的安装
    LAMP环境的搭建(四)----Apache下部署项目
    LAMP环境的搭建(二)----Mysql安装与配置
    LAMP环境的搭建(一)----Apache安装
    shared memory segment exceeded your kernel's SHMMAX parameter
    无锁队列的实现
    CAS中的ABA问题
    MESI-CPU缓存一致性协议
    CAS lock-free
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/7230023.html
Copyright © 2011-2022 走看看