基础知识1——实例内存结构

实例内存结构
instance由系统全局区SGA的共享内存块以及大量的后台进程组成.

SGA必须包含:数据库缓冲区缓存DB buffer,日志缓冲区Log buffer,共享池shared pool.

SGA可能包含:大池large pool,Java池java pool,流池stream pool. 

对这些结构的大小管理,大多可自动完成,DBA也可自行控制,建议使用自动管理.



数据库缓冲区缓存DB Buffer:是oracle执行SQL的区域.更新数据时用户会话不直接更新磁盘上的数据,包含关键数据的数据块首先复制到数据库缓冲区缓存. 更改应用于数据库缓冲区缓存中这些数据块的副本.此后,块将在缓存中保留一段时间,直至其占有的缓冲区需要缓存另一个块为止.
查询数据时,数据也要经过缓存.会话计算出哪些块包含关键的行,并将它们复制到数据库缓冲区缓存,此后相关行传输到会话的 PGA作进一步处理,块也会在数据库缓冲区缓存中保留一段时间.

为了执行用户进程提交的select语句,会话的服务器进程将扫描缓冲区缓存包含相关行的数据块,找到了就会发生一次缓冲区缓存命中. 如果没命中,服务器进程在将结果发送给用户进程前,会将包含相关行的数据从数据文件读入缓冲区.

如果缓冲区存储的块映像与磁盘上的不同,这样的缓冲区叫"脏缓冲区",当块第一次复制到其中时,叫"干净缓冲区":此时缓冲区块 映像与磁盘上的块映像是相同的.当块更新时,缓冲区将变脏.最终,脏缓冲区必须写回到数据文件,此时缓冲区又变得干净了. 即使 写入磁盘后,此块也保留在内存中一段时间,不会被另一个块重写.

数据库缓冲区缓存大脚对性能影响很大.缓存应足够大,便于缓存所有频繁访问的块,但又不能过大,缓存那些极少使用的块.

数据库缓冲区缓存在实例启动时分配,可动态调整其大小,也可进行自动管理.




日志缓冲区Log Buffer:小型的,用于短期存储将写入到磁盘上的重做日志变更向量的临时区域.会话服务器进程不将 重做记录直接写入重做日志文件,会话将重做记录写入内存中的日志缓冲区,随后 日志缓冲区写出到重做日志文件,会话 发出commit语句时,会实时执行日志缓冲区写操作,写操作由日志写入器后台进程(LGWR)完成.

日志缓冲区比较小,一般为几MB,默认值由oracle服务器确定,并取决于服务器节点中的CPU数量.不能设置小于默认值的日志缓冲区,如果这么做, 日志缓冲区一定会被设置为默认大小.

日志缓冲区在启动实例时分配,如果不重启实例,就不能在随后调整其大小,它是一个循环缓冲区.大小固定不变,启动实例 时被设置为默认值,无法对其进行自动管理.


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




共享池:最复杂的SGA结构,简单介绍4个共享池组件:
   - 库缓存(library cache)
   - 数据字典缓存(dictionary cache)
   - PL/SQL区
   - SQL查询和PL/SQL函数结果缓存

共享池中的所有结构是自动管理的,在共享池的总体大小范围内,各个结构的大小针对实例的活动模式而异. 共享池本身大小可动态重调.

库缓存:是内存区域,按其已分析的格式存储最近执行的代码,通过将代码缓存在共享池,可以在不重新分析的情况下重用,极大地提高性能.

数据字典缓存:有时叫"行缓存",它存储最近使用的对象定义:表,索引,用户和其它元数据定义的描述.通过将此类定义放在SGA的内存中, 以便使所有会话可以直接访问它们,而不用从磁盘上的数据字典中重复读取,提高性能.

PL/SQL区:存储的PL/SQL对象是过程,函数,打包的过程,打包的函数,对象类型定义和触发器.它们全都像源代码那样存储在数据字典中. 当会话调用存储的PL/SQL对象时,它必须从数据字典读取.为了避免重复读取,将对象缓存到共享池的PL/SQL区.

SQL查询和PL/SQL函数结果缓存: 结果缓存是11g新功能,在很多应用程序中,同一个查询将由同一个会话或多个不同会话执行多次.通过创建结果缓存,oracle可将 此类查询的结果存储在内存中,在下次发出查询时,服务器可以检索缓存的结果,而不用运行该查询.

共享池大小设置对性能影响很大,足够大,也不能过大.共享池中的内存按照LRU(最近最少使用)算法来分配. 在实例启动时分配,大小是 动态的,可进行自动管理.


大池:可选区域,如果创建大池,那些在不创建大池时使用共享池内存的不同进程将自动使用大池.大池的一个主要用途是供共享 的服务器进程使用. 设置大池的大小与性能无关,某个进程需要大内存池,而内存不够用,则此进程将失败并报错,大池的大小可动态调整,而且可以自动管理.

Java池:应用程序需要在数据库中运行Java存储过程时才需要Java池.注意!Java代码不在Java池中缓存,而在共享池中缓存. Java池大小是动态的,可自动管理.

流池:供oracle流使用,从重做日志提取变更向量,使用这些重新构造执行的语句,在远程数据库执行. 大小动态的,可自动管理.




显示SGA的当前,最大和最小容量:

select component,current_size,min_size,max_size from v$sga_dynamic_components


确定已为PGA分配了多少内存:

select name,value from v$pgastat

where name in ('maximum PGA allocated','total PGA allocated')


















来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25025926/viewspace-1067523/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25025926/viewspace-1067523/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值