Oracle实例由共享内存块(SGA)以及大量的后台进程构成。

SGA必须包含的数据结构:

  • 数据库缓冲区缓存
  • 日志缓冲区
  • 共享池

可选的数据结构:

  • 大池
  • JAVA池
  • 流池
  • 其他缓冲区缓存池

用户会话还需要服务器端的内存。此内存是不共享的PGA。每个会话都有自己专用的PGA。

数据库缓冲区缓存

数据库缓冲区缓存是Oracle用来执行SQL的工作区域。

在更新数据时,用户的会话不直接更新磁盘上的数据。包含相关数据的数据块首先复制到数据库缓冲区缓存。更改应用于数据库缓冲区缓存中的这些数据块的副本。此后,块将在缓存中保留一段时间,直至其占有的缓冲区需要缓存另一块为止。

在查询数据时,数据也要经过缓存。会话计算出哪些块包含相关的行,并将它们复制到数据库缓冲区缓存。此后,相关行的投影列传输到会话的PGA作进一步处理。与上面一样,此后块会在数据库缓冲区缓存中保留一段时间。

数据文件的格式被设置为固定大小的块。表行和其他数据对象存储在这些块中。数据库缓冲区缓存的格式被设置为内存缓冲区,每个可以容纳一个块。与块不同,行的长度取决于为表定义的列的数量(不管列是否真的包含内容,也不考虑包含什么内容)。根据块的大小(由DBA选择)和行的大小(取决于表设计和使用),每个块中可能有多个行,也可能有一个行延伸到多个块中。

如果缓冲区的缓存中存储的块的映像与磁盘上的映像不同,那么这样的缓冲区常称为“脏缓冲区”。当块第一次复制到其中时,缓冲区是“干净缓冲区”:此时,缓冲区中的块的映像与磁盘上的块映像是相同的。当其中的块更新时,缓冲区将变脏。最终,脏缓冲区必须写回到数据文件,此时,缓冲区又变得干净了。即使在写入磁盘后,此块也仍保留在内存中,可能有一段时间,此缓冲区不会被另一个块所重写。缓冲区的更新频率(或COMMIT的数量)与何时写回数据文件没有任何关系:改变了的块可以在COMMIT命令之前或之后写入数据文件。在正常运行过程中,常常有未提交的数据要写入数据文件,或已提交的更改还没有写入。

在缓冲区缓存中管理块:

缓冲区缓存中的块实质上在一个位置上管理,但有两个不同的列表指向这些块。

  • 脏(dirty)块列表,其中的块需要由数据库块写入器(DBWn)写入磁盘
  • 非脏(nondirty)块列表

Oracle采用了一种接触技术(touch count,也称使用计数)算法,如果命中缓存中的一个块,则会增加与之关联的计数器。不是说每次命中这个块都会增加技术,而是大约3秒一次。有一组相当神奇的X$表,利用其中的某个表就可以看出这个算法是怎样工作的。X$BH表显示了块缓冲区缓存中块的有关信息(文档中有记录的V$BH视图也能提供块的有关信息,不过X$BH表提供的信息更多)。在这个表中可以看到,我们命中块是,接触技术会增加。可以对这个表运行一下查询,得到5个“当前最热的块”,并把这个信息与DBA_OBJECTS视图联结,得出这些块属于哪些段。

 select tch,
file#,
dbablk,
case
when obj = 4294967295 then
'rbs/compat segment'
else
(select max('(' || object_type || ')' || owner || '.' ||
object_name) || decode(count(*), 1, '', ' maybe!')
from dba_objects
where data_object_id = x.obj)
end what
from (select tch, file#, dbablk, obj
from x$bh
where state <> 0
order by tch desc) x

如果想了解块关联的信息,可以使用查询

select * from dba_extents where file_id = FILE# and block_id <= DBABLK and block_id+blocks-1 >= DBABLK

对于重复查询的块,也可以观察Oracle如何递增这个块的接触计数

 select tch,file#,dbablk,DUMMY
from x$bh,(select dummy from dual)
where obj = (select data_object_id
from dba_objects
where object_name = 'DUAL'
and data_object_id is not null)

数据库缓冲区缓存的大小会对性能产生至关重要的影响。缓存应足够大,以便能缓存所有频繁访问的块,但也不能过大,以至于它会缓存极少使用的块。如果缓存过小,那么将导致磁盘活动过多,因为频繁访问的块持续从磁盘读取,并由其他块使用和重写,然后再从磁盘读取。如果需要格式化一个极大的数据库缓冲区缓存,则实例的启动速度会变慢。

可以动态调整数据库缓冲区缓存的大小,也可以对其进行自动管理。

日志缓冲区

日志缓冲区是小型的临时区域,用于短期存储将写入到磁盘上的重做日志的变更向量。执行DML语句会生成应用于数据的变更向量。有了重做日志,数据库就可以确保数据永不丢失:每当数据块发生更改时,都会将应用于块的变更向量写到重做日志,如果需要还原数据文件,则通过重做日志,可以将变更向量提取并应用于数据文件备份。这样,数据文件就可能是最新的。

会话服务器进程不将重做记录直接写入重做日志文件,否则,每当执行DML语句是,会话将不得不等待磁盘I/O操作完成。相反,会话将重做记录写入内存中的日志缓冲区。这样做的速度将远比写入磁盘快。此后,日志缓冲区写出到重做日志文件。因此,日志缓冲区对磁盘的一次写入是来自多个事务的一批变更向量。即使如此,日志缓冲区中的变更向量也是接近实时地写入磁盘,当会话发出COMMIT语句时,会实时执行日志缓冲区写操作。写操作由日志写入器后台进程(LGWR)完成。

日志缓冲区默认值由Oracle服务器确定,而且取决于服务器节点中的CPU数量。默认值通常是合适的。

理解COMMIT语句的处理过程非常重要。当发出commit语句时,一部分提交处理涉及将日志缓冲区内容写入磁盘上的重做日志文件。写操作实施执行,在其进行过程中,发出commit的会话将挂起。要确保提交的事务永不丢失,那么,在缓存中的数据块发生更改(意味着事务已完成)而且将变更向量写入磁盘上的重做日志前,不能讲完成提交的消息返回给会话。

在Oracle体系结构中,将日志缓冲区转储到磁盘是基本瓶颈之一。DML的速度不能超过LGWR将变更向量转储到联机重做日志文件的速度。

日志缓冲区的大小固定不变,在启动实例时被设置为固定值。无法对其进行自动管理。

共享池

共享池是最复杂的SGA结构。它分为许多子结构,这些子结构由Oracle服务器内部管理。

库缓存

库缓存是内存区域,按其已分析的格式存储最近执行的代码,可以在不重新分析的情况下重用,极大的提高性能。

数据字典缓存

数据字典缓存有时称为“行缓存”。存储最近使用的对象定义:表、索引、用户和其他元数据定义的描述。将此类定义放在SGA的内存中,以便使所有会话可以直接访问它们,而不是被迫从磁盘上的数据字典中重复读取它们,从而提高分析性能。缓存的对象定义可以用于分析许多不同的语句。

SQL查询和PL/SQL函数结果缓存

Oracle服务器可以将此类查询的结果存储在内存中。结果缓存机制具有足够的智能,跟踪查询运行所针对的表是否发生了更新。默认方式下,将禁用SQL查询和PL/SQL函数结果缓存,但如果以编程方式将其启用,就可以极大地提高性能。此缓存位于共享池中:DBA可以指定其最大容量。

共享池在实例启动时分配。可以采用手动方式重新调整,也可以根据工作负荷自动重新调整大小(如果启动了自动化机制)。

Oracle 体系结构二 内存结构的更多相关文章

  1. Oracle体系结构之内存结构(3)

    Oracle内存结构由系统全局区SGA和程序全局区PGA组成. SGA是实例启动的时候分配的Oracle实例中的一个基本成分. PGA是服务器进程启动时分配. 1.系统全局区SGA 系统全局区SGA由 ...

  2. jvm系列二内存结构

    二.内存结构 整体架构 1.程序计数器 作用 用于保存JVM中下一条所要执行的指令的地址 特点 线程私有 CPU会为每个线程分配时间片,当当前线程的时间片使用完以后,CPU就会去执行另一个线程中的代码 ...

  3. Oracle体系结构二(学习笔记)

  4. Oracle体系结构二

  5. Oracle的内存结构

    备注:本图片截图自“炼数成金” Oracle的体系结构分为内存结构.进程,磁盘文件. 内存结构分为SGA, PGA.SGA是系统全局区,是所有的用户共享区,PGA是某个用户的私有区. SGA分为sha ...

  6. Oracle体系结构详解

    对于一门技术的学习,尤其是像Oracle database这种知识体系极其庞杂的技术来讲,从宏观上了解其体系结构是至关重要的.同时,个人认为,未必是专业DBA人员才需要了解其体系结构(固然对于数据库专 ...

  7. 三、oracle 体系结构

    1.oracle内存由SGA+PGA所构成 2.oracle数据库体系结构数据库的体系结构是指数据库的组成.工作过程与原理,以及数据在数据库中的组织与管理机制. oracle工作原理: 1).在数据库 ...

  8. oracle 体系结构解析

    三.oracle 体系结构 1.oracle内存由SGA+PGA所构成 2.oracle数据库体系结构数据库的体系结构是指数据库的组成.工作过程与原理,以及数据在数据库中的组织与管理机制. oracl ...

  9. 【转】oracle 体系结构

    前几天面试的时候面试官才问过我Oracle的体系结构,让我在一张白纸上画出来.回头想想当时答得还不错,大部分内容都描述出来了,呵呵,刚才在网上看到一篇讲解ORACLE体系结构的文章,觉得不错,转过来存 ...

随机推荐

  1. 【转】Dom节点操作常用方法

    1.访问/获取节点 document.getElementById(id); //返回对拥有指定id的第一个对象进行访问 document.getElementsByName(name); //返回带 ...

  2. java 用Graphics制作模糊验证码

    这篇随笔主要是java中制作验证码的效果,由于是在国庆前做的,现在也找不到原载了.我对自己整理的发表一份 生成的验证码效果如下: 一.建立一个工具类,用来生成验证码 package com.dkt.u ...

  3. docker镜像使用和总结

    一.Docker镜像是什么? 操作系统分为内核和用户空间.在Linux中,内核启动后会挂载 root 文件系统为其提供用户空间支持. docker镜像就相当于一个 root文件系统.比如:官方镜像ub ...

  4. 2-3 Sass的函数功能-列表函数

    列表函数主要包括一些对列表参数的函数使用,主要包括以下几种: length($list):返回一个列表的长度值: nth($list, $n):返回一个列表中指定的某个标签值 join($list1, ...

  5. VC添加文件到工程出错问题--FileTool.dll

    原文:http://blog.csdn.net/bingdianlanxin/article/details/45112737 在我们的软件开发中,经常需要导入其他文件到我们的工程. 一般,我们会选择 ...

  6. Python爬虫教程-28-Selenium 操纵 Chrome

    我觉得本篇是很有意思的,闲着没事来看看! Python爬虫教程-28-Selenium 操纵 Chrome PhantomJS 幽灵浏览器,无界面浏览器,不渲染页面.Selenium + Phanto ...

  7. Git学习-Git配置(一)

    零.前言 Git是一个工具,就没必要把时间浪费在那些"高级"但几乎永远不会用到的命令上.一旦你真的非用不可了,到时候再自行Google或者请教专家也未迟. 如果你是一个开发人员,想 ...

  8. ado.net c#基本的增加,修改,删除,查询

    自己初次学习用的,各种不规范,注释没写 class AdoDemo { static string strConn = @"Data Source=server1;Initial Catal ...

  9. ibatis Order By注入问题

    上周六单位被扫描出SQL注入漏洞 经过检查,发现ibatis框架都可能出现这个问题.如果有需求,让你实现页面grid所有字段都能排序,你会怎么做呢? 最简单的做法就是从页面把字段名,排序类型传回来,然 ...

  10. [问题记录]libpomelo工程调整编译链接错误

    1. 描述: 如下图所示,出现链接错误.那么链接问题一般也就两块设置: (1)包含路径Additional Library Directories (2)lib库的包含Additional Depen ...