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. AMD 规范与CMD 规范概要

    命名冲突和文件依赖,是前端开发过程中的两个经典问题.通过模块化开发来解决. AMD 规范在这里:https://github.com/amdjs/amdjs-api/wiki/AMD CMD 规范在这 ...

  2. 滴滴开源 Vue 组件库— cube-ui

    cube-ui 是滴滴去年底开源的一款基于 Vue.js 2.0 的移动端组件库,主要核心目标是做到体验极致.灵活性强.易扩展以及提供良好的周边生态-后编译. 自 17 年 11 月开源至今已有 5 ...

  3. 车厢调度(train.cpp)

    车厢调度(train.cpp) [问题描述]        有一个火车站,铁路如图所示,每辆火车从A驶入,再从B方向驶出,同时它的车厢可以重新组合.假设从A方向驶来的火车有n节(n<=1000) ...

  4. java中如何使用BigDecimal使得Double类型保留两位有效数字

    一.场景:从数据表中读出Decimal类型的数据直接塞给Double类型的对象时,并不会有什么异常. 如果要再此基础上计算,就会发生异常. 比如:读出数据为0.0092,将其乘以100,则变成了0.9 ...

  5. XPath路径表达式笔记(转载)

    简单说,xpath就是选择XML文件中节点的方法. 所谓节点(node),就是XML文件的最小构成单位,一共分成7种. - element(元素节点)- attribute(属性节点)- text ( ...

  6. UFW Essentials: Common Firewall Rules and Commands

    Introduction UFW is a firewall configuration tool for iptables that is included with Ubuntu by defau ...

  7. 08_Redis持久化——RDB方式

    [简述] 持久化:Redis能将数据从内存中以某种形式同步到硬盘中,使得重启后可以根据硬盘中的记录恢复数据,这一过程就是持久化. Redis支持两种方式的持久化,简单来说如下: RDB方式:会根据指定 ...

  8. 《effective c++》读书笔记(上)

    最近在读<Effective C++>,确实是经典之作,但是有的条款也需要一些细节补充,所以都列在这篇文章里,希望能不断更新,个人阅读的是第三版,不包括C++ 11的内容. 条款1:视C+ ...

  9. 查看源代码HTML

    HTML 提示 - 如何查看源代码 如果您想找到其中的奥秘,只需要单击右键,然后选择“查看源文件”(IE)或“查看页面源代码”(Firefox),其他浏览器的做法也是类似的.这么做会打开一个包含页面 ...

  10. web项目开发流程

    对于一个web项目,在实际编码之前,有一些通用的步骤来planning a website: 0.Defining the project (predr0->dr0) 对于外部项目,客户一般会发 ...