`
linsea
  • 浏览: 90045 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Oracle内存结构与管理

阅读更多

Oracle内存结构与管理

 

内存结构

SGA(System Global Area):系统全局区。

PGA(Processor Global Area):进程全局区。

UGAUser Global Area:与特定会话相关联,如果使用共享服务器模式则它在SGA中分配,因为每个共享服务器进程都能访问它,如果使用专用服务器模式,则它在PGA中分配。

 

9i开始,有两种方法管理PGA中的非UGA内存:手动/自动PGA内存管理。

9i中,如果采用共享服务器模式,则只能使用手动PGA管理。

 

手动PGA内存管理:

SORT_AREA_SIZE:排序使用的内存。

SORT_AREA_RETAINED_SIZE:排序完成后用于保存已排序数据内存总量,排好序放不下的数据将写到临时表空间中。

HASH_AREA_SIZE:存储散列表所用的内存量。

 

注意的几点:

1.         *_AREA_SIZE参数控制的是操作所用的最大内存量,只是对一个操作的限制而非会话。一个会话中一个查询可能有多个操作,所以可能超过实际的设置值。这些内存根据需要而分配,而且可以收缩。

2.         SORT_AREA_SIZE ~ SORT_AREA_RETAINED_SIZE 这部分内存分在PGA中分配,SORT_AREA_RETAINED_SIZE 这部分内存分在UGA中分配。

 

自动PGA内存管理(APMM):

10G默认处于启用状态,两个初始化参数需要指定,如果PGA_AGGREGATE_TARGET没有明显地设置,则它默认为10MBSGA容量的20%

WORKAREA_SIZE_POLICYMANUAL AUTO(默认值)

如果为MANUAL则会使用排序区和散列区大小参数来分配内存量。

PGA_AGGREGATE_TARGET:控制所有工作区(即排序区和散列区)总共应分配内存量。可以在系统级或会话级打开自动PGA内存管理。

PGA相关的视图有:v$pgastatv$pag_target_advice(顾问视图)。

注意的几点:

1.         PGA_AGGREGATE_TARGET只是一个理论上的上限“目标”,并不会在启动时真正分配这么多内存。而且在有必要时会超过这个值。

2.         串行会话只使用目标值中很少的一部分,每个工作区只会使用大约5%或更少。并行查询最多可以使用PGA_AGGREGATE_TARGET30%,即每个并行进程使用的内存量大约为:0.3* PGA_AGGREGATE_TARGET/并行进程数。

3.         尽管工作区在PGA内存中所占的比重很大,但PGA内存中并非只有工作区。PGA内存分配涉及很多方面,其中只有工作区在数据库实例的控制之下。如果创建并执行一个PL/SQL代码块将数据填入一个很大的数组,如果采用专用服务器模式,则UGAPGA中,倘若是这样,Oracle只能任由你这样做,而无法干涉。数据库本身无法控制PGA中分配的这些内存。不过,数据库很清楚我们做了什么。尽管有些内存无法控制,但它不会忽略这部分内存;而是会识别已经使用的内存,并相应地减少为工作区分配的内存大小。由于一些PGA内存不在Oracle的控制之下,所以如果在PL/SQL代码中分配了大量很大的数据结构,就很容易超出PGA_AGGREGATE_TARGET。这说明PGA_AGGREGATE_TARGET不能算是一个硬性限制,而更应该算是一个请求。

 

SGA内存管理:

SGA中的内存池:

l         Java pool: 为数据库中运行的JVM分配的固定内存。

l         Large pool: 共享服务器连接使用它作为会话内存,并行执行特性使用它作为消息缓冲区,另外RMAN使用它作为磁盘I/O缓冲区。

l         Shared pool: 包含共享游标、存储过程、状态对象、字典缓存等。

l         Stream pool: Oracle流是数据库的一个数据共享工具。

l         “Null pool”: 这个池其实没有名字。这是块缓冲区(缓存的数据库块)、重做日志缓冲区和“固定SGA“区专用的内存。

SGA影响最大的参数:

l         JAVA_POOL_SIZE

l         SHARED_POOL_SIZE

l         LARGE_POOL_SIZE

l         DB_*_CACHE_SIZE:共有8CACHE_SIZE参数,控制各可用缓冲区缓存的大小。主要用于支持可传输的表空间而非性能调优。

l         LOG_BUFFER

l         SGA_TARGET10G及以上版本用于自动SGA内存管理。

l         SGA_MAX_SIZE:用于控制DB启动并运行中SGA可以达到的最大大小。

说明:9i需手动设置各值大小,10G才开始有自动SGA内存管理,自动管理时只需把SGA_TARGET参数设置为所需的SGA大小即可,各池的值由系统自动设置。

 

各池的内存以一种称为颗粒(granule, 也称区组)的单位来分配,其大小为4MB8MB16MB的内存区。

可以通过视图v$sgastat查看各池大小及分配情况:select * from v$sgastat ;

可以通过视图v$sga_dynamic_components查看各池所用的颗粒大小。

select component, granule_size from v$sga_dynamic_components;

 

l         固定SGAfixed SGA):

它是SGA中的一个组件,它有一组指向SGA中其他组件的变量及参数值,它一般都很小,可以把它想成是SGA中的“自启”区,通过它才能找到SGA中的其他区。

l         重做缓冲区(redo buffer)

缓存重做日志,取值为MAX(512KB,128*CPU个数)LGWR会在以下某个情况发生时启动对这个区的刷新输出:

Ø         3秒一次

Ø         无论何时有人提交请求

Ø         要求LGWR切换日志文件

Ø         重做缓冲区1/3满,或者包含了1MB的缓存重做日志数据

注意在引入增量检查点后,日志切换操作不一定触发检查点进程。

 

l         块缓冲区缓存(block buffer cache:

SGA中一个很重要的区,各个段的已缓存块可放在3个位置上:

默认池(default pool):所有段块一般都在这个池中缓存。

保持池(keep pool):缓存访问相当频繁的段。

回收池(recycle pool):缓存访问很随机的大段,一般不会多次访问,需快速回收。

利用一定的算法及两个列表管理缓存块:

脏块列表(写列表):其中的块需要由DB块写入器(DBWn)写入磁盘。

非脏块列表(LRU列表,Least Recently Used):也跟踪缓存区中未使用的内存块。

可通过DB Buffer Cache 顾问设置DB Buffer Cache,视图:v$db_cache_advice

Select name, size_for_estimate, size_factor, estd_physical_reads from v$db_cache_advice;

每条记录都预先估计了在DB高速缓存区大小固定的情况下所需的物理读取数。

 

l         共享池

包含共享游标、存储过程、状态对象、字典缓存等。特别是数据字典,访问非常频繁,须缓存在池中。共享池的特点是有大量小的内存块(chunk),一般为4 KB或更小,目标是使用小块的内存来避免碎片问题。共享池中的内存根据LRU(最近最少使用)的原则来管理。如果你不用某个对象,它就会丢掉。为此提供了一个包,名叫DBMS_SHARED_POOL,这个包可用于改变这种行为,强制性地“钉住”共享池中的对象。可以使用这个过程在数据库启动时加载频繁使用的过程和包,并使它们不至于老化。如果你真的想破坏Oracle的共享池,最容易的办法是不使用绑定变量。

Oracle 9iSELECT SUM(BYTES) FROM V$SGASTAT总是略大于SHOW PARAMETER SHARED_ POOL_SIZE。这是因为共享池还保存了另外的许多结构,它们不在相应参数的作用域内。SHARED_POOL_SIZE通常占了共享池(SUM(BYTES)报告的结果)中最大的一部分,但这不是共享池中惟一的一部分。V$SGASTAT中的“共享池”与参数SHARED_POOL_SIZE的命名让人很容易混淆,这个参数对共享池大小贡献最大,但是它并不是惟一有贡献的参数。不过,在Oracle 10g 及以上版本中,假设你使用手动的SGA内存管理,二者之间存在一对一的对应关系。

可以利用共享池顾问程序帮助设置大小,查询视图:v$shared_pool_advice

Select shared_pool_size_for_estimate, shared_pool_size_factor, estd_lc_time_saved

From v$shared_pool_advice

这个查询说明了共享池大小确定的情况下所节省的库高速缓存分析时间量,而且通过20条记录返回了共享池从当前一半大小到两倍大小时的估计时间。

 

l         大池(large pool

它用于大块内存的分配,大块内存分配则是得到一块内存后加以使用,然后就到此为止,没有必要缓存这个内存。大池就是一个回收型的内存空间,共享池则更像是保持缓冲区池。

大池专门用于以下情况:

Ø         共享服务器连接,用于在SGA中分配UGA区。

Ø         语句的并行执行,允许分配进程间的消息缓冲区,这些缓冲区用于协调并行查询服务器。

Ø         备份,在某些情况下用于RMAN磁盘I/O 缓冲区。

使用共享服务器连接时,并不是一定得使用大池。如果没有大池,而且使用了一个共享服务器连接,就会像Oracle 7.3及以前版本中一样从共享池分配空间。过一段时间后,这会导致性能恶化,一定要避免这种情况。如果DBWR_IO_SLAVES或者PARALLEL_MAX_SERVERS参数设置为某个正值,大池会默认为某个大小。如果使用了一个用到大池的特性,建议手动设置大池的大小。

 

l         Java

支持在数据库中运行Java。如果采用专用服务器模式,Java池包括每个Java类的共享部分,由每个会话使用。每个会话的状态存储在PGAUGA中,9i及以前版本中Java池的总大小是固定的,需要估计应用的总需求,再把估计的需求量乘以所需支持的并发会话数,所得到的结果能指示出Java池的总大小。每个Java UGA会根据需要扩大或收缩,但是要记住,池的大小必须合适,所有UGA加在一起必须能同时放在里面。在 Oracle10g 及以上版本中,这个参数可以修改,Java池可以随着时间的推移而扩大和收缩,而无需重启数据库。

使用共享服务器连接来连接Oracle时,Java池包括以下部分:

Ø         每个Java类的共享部分。

Ø         UGA中用于各会话状态的部分,这是从SGA中的JAVA_POOL分配的。UGA中余下的部分会正常地在共享池中分配,或者如果配置了大池,就会在大池中分配。

 

l         流池(stream pool

流池是一个新的SGA结构,从Oracle 10g开始才增加的。流(Stream)本身就是一个新的数据库特性,Oracle9i Release 2及以上版本中才有。它设计为一个数据库共享/复制工具,这是Oracle在数据复制方面发展的方向。流池(或者如果没有配置流池,则是共享池中至多10%的空间)会用于缓存流进程在数据库间移动/复制数据时使用的队列消息。

流池只对使用了流数据库特性的系统是重要的。在这些环境中,必须设置流池,以避免因为这个特性从共享池“窃取”10%的空间。

 

自动SGA内存管理(ASMM):

要使用自动管理,需要设置参数SGA_TARGETSTATISTICS_LEVEL=TYPICALALL,因为不支持统计集合,数据库就没有必要的历史信息来确定大小)。在Oracle9i及以前版本中,只能用手动SGA内存管理,不存在参数SGA_TARGET,而且参数 SGA_MAX_SIZE只是一个上限,而不是动态目标,但10G中时SGA_TARGET设置不能超过它。

Oracle 10g中,与内存相关的参数可以归为两类:

Ø         自动调优的SGA参数:目前这些参数包括DB_CACHE_SIZESHARED_POOL_SIZELARGE_POOL_SIZEJAVA_POOL_SIZE

Ø         手动SGA参数:这些参数包括LOG_BUFFERSTREAMS_POOLDB_NK_CACHE_SIZEDB_KEEP_CACHE_SIZEDB_RECYCLE_CACHE_SIZE

Oracle 10g中,任何时候你都能查询V$SGAINFO,来查看SGA的哪些组件的大小可以调整。

采用自动SGA内存管理时,确定自动调整组件大小的主要参数是SGA_TARGET,这个参数可以在数据库启动并运行时动态调整,最大可以达到SGA_MAX_SIZE参数设置的值(默认等于SGA_TARGET,所以如果想增加SGA_TARGET,就必须在启动数据库实例之前先把SGA_MAX_SIZE设置得大一些)。数据库会使用SGA_TARGET值,再减去其他手动设置组件的大小(如DB_KEEP_CACHE_SIZEDB_RECYCLE_CACHE_SIZE等),并使用计算得到的内存量来设置默认缓冲区池、共享池、大池和Java池的大小。在运行时,实例会根据需要动态地对这4个内存区分配和撤销内存。

随着时间的推移,当实例的内存需求越来越确定时,各个SGA组件的大小也越来越固定。即便数据库关闭后又启动,数据库还能记得组件的大小,因此不必每次都从头再来确定实例的正确大小。这是通过4个带双下划线的参数做到的:__DB_CACHE_SIZE__JAVA_POOL_SIZE__LARGE_POOL_SIZE__SHARED_POOL_SIZE。如果正常或立即关闭数据库,则数据库会把这些值记录到存储参数文件(SPFILE</s

分享到:
评论

相关推荐

    Oracle内存结构全面分析

    总之,Oracle内存结构的全面分析涵盖了SGA、PGA和UGA的各个组成部分,以及如何通过参数调整和管理策略优化内存使用,以实现最佳的数据库性能。了解这些内存结构及其交互方式对于解决性能问题和预防故障至关重要。

    oracle内存管理,深入浅出oracle内存管理,盖国强oracleppt

    5. **Shared Pool与Shared SQL**:Shared Pool是Oracle内存管理的重要组成部分,它存储了SQL语句的解析结果,避免了重复解析,从而提高了系统性能。在Oracle 11g中引入了Result Cache,进一步优化了SQL查询的性能,...

    ORACLE内存结构与表空间知识

    ### ORACLE内存结构与表空间知识 #### 一、Oracle的服务方式 Oracle提供了三种不同的服务方式,每种方式都有其特定的应用场景和内存管理特点。 ##### 1. 专用服务器 (Dedicated Server) - **服务流程**:当...

    ORACLE自动内存管理和存储调整

    PGA(Program Global Area)是 ORACLE 数据库中的一种内存结构,它用于存储会话级别的数据。PGA 的调整也需要满足两个前提条件: 1. WORKAREA_SIZE_POLICY 参数必须设置为 AUTO。 2. PGA_AGGREGATE_TARGET 参数不能...

    Oracle的内存结构和进程结构

    理解Oracle的内存结构和进程结构对于数据库管理员来说至关重要,因为这些组件直接影响着数据库的性能、稳定性和资源利用效率。通过对这些区域的监控和调整,可以优化数据库的工作表现,确保系统的高效运行。

    Oracle内存结构与实例及其管理

    总的来说,Oracle内存结构与实例管理涉及到多个层面,包括内存分配策略、各内存区域的使用以及后台进程的协同工作。深入理解和优化这些方面,对于提升数据库性能和保证服务稳定性具有不可忽视的作用。

    Oracle内存管理(深入解析)

    总的来说,Oracle内存管理涉及到多个层面,包括进程私有内存(PGA)和全局共享内存(SGA)的配置、使用和优化。深入理解这些概念并掌握相应的监控和调整技巧,是确保Oracle数据库高效稳定运行的基础。通过持续的学习...

    Oracle 内存分配与调整

    Oracle内存结构主要分为两大部分:SGA(System Global Area)和PGA(Program Global Area)。SGA是数据库进程共享的一块内存区域,而PGA则是每个单独数据库进程的私有内存空间。 1. SGA(系统全局区) - 数据缓冲...

    Oracle 10g内存结构

    Oracle 10g的内存结构是数据库管理系统的关键组成部分,它决定了数据库的性能和稳定性。SGA(System Global Area)是Oracle数据库中一个重要的共享内存区域,用于存储数据库运行时的各种数据和控制信息。 1. SGA...

    Oracle 12c完整后台进程&内存结构图 DBA必备

    Oracle 12c 的内存结构图展示了数据库的内存分配和管理机制。以下是 Oracle 12c 的主要内存结构组件: 1. Shared Pool:负责管理共享SQL、存储过程和函数的执行计划。 2. Library Cache:负责管理共享的库对象。 3....

    oracle 内存分配与调整 。pdf

    Oracle数据库是全球广泛使用的...通过理解Oracle内存结构,结合实际工作负载,合理调整内存分配,可以显著提升Oracle数据库的运行效率和稳定性。在实际操作中,应根据具体环境和需求,综合运用各种方法来优化内存配置。

    Oracle内存管理

    Oracle内存管理是数据库系统中的关键组成部分,它直接影响到数据库的性能和稳定性。Oracle数据库使用复杂的内存结构来存储和处理数据,这些内存结构包括共享池、数据缓冲区缓存、PGA(程序全局区)和SGA(系统全局区...

    oracle数据库体系结构之一【内存结构】.docx

    内存管理是Oracle数据库性能优化的重要方面,合理配置和调整内存结构可以显著提高数据库的响应速度和资源利用率。监控内存使用情况,分析性能指标,适时调整相关参数,是确保数据库高效运行的关键。

    oracle内存全面分析

    本文将深入探讨Oracle内存结构,包括SGA(System Global Area)和PGA(Program Global Area),以及如何进行全面的内存分析。 一、Oracle内存架构 1. SGA(系统全局区) SGA是Oracle数据库运行时共享的一片内存...

    oracle内存资源分配

    总之,"Oracle内存资源分配"是一个涉及多方面知识的复杂主题,需要深入理解Oracle内存结构,熟悉各种内存参数,以及具备一定的性能监控和调优技巧。通过合理的内存分配,我们可以最大化数据库性能,满足业务需求,...

    Oracle 12c数据库体系结构图文详解手册

    Oracle 12c数据库体系结构图文详解手册是 Oracle 12c数据库管理系统的核心组件之一,该手册详细介绍了 Oracle 12c数据库的体系结构、实例、数据库、内存结构、后台进程、控制文件、重做日志文件、数据文件等概念。...

    oracle体系结构、ocp笔记

    "Oracle体系结构与OCp笔记" ...本节笔记对Oracle体系结构进行了详细的讲解,涵盖了数据库、实例、Oracle网络架构和Oracle内存架构等方面的知识点,为读者提供了一个系统的Oracle体系结构知识框架。

    Oracle的内存结构与进程结构.doc

    当数据库启动时,系统会在服务器内存中分配系统全局区(SGA),这是Oracle内存结构的基础。接着,一系列常驻内存的后台进程会被启动,共同构成了Oracle的进程结构。这些内存区域和后台进程一起构成实例,每个实例...

Global site tag (gtag.js) - Google Analytics