oracle内存结构及注释

来源:互联网 发布:淘宝采集软件违规吗 编辑:程序博客网 时间:2024/06/03 07:54

Oracle把信息存储在内存和磁盘上,磁盘扫描,即物理I/O,与内存访问比较起来,一般要花更多的时间。而且物理I/O还会增加CPU资源的请求,如设备驱动的路径长度,操作系统event schedulers,所以,在内存里访问数据比从磁盘访问数据更能满足性能的需要。性能调整的一个目标就是要尽可能的减少物理 I/O的开销。

所以,适当的设置Oracle各内存组件大小和有效的利用他们,可以非常大的提高数据库的性能(综合考虑SGA组件大小,PGA组件大小,操作系统需要的内存大小,其他程序需要的内存大小),Oracle内存优化,是一个重复尝试、观察的过程。

 

Oracle使用内存来存储类似如下的信息:

★程序代码。

★连接的会话信息,即使当前这个会话不活跃了。

★程序执行过程中需要的信息(例如,一个查询当前从第几行取值的状态)。

oracle进程间共享和通讯的信息(例如,锁信息)。

★永久存储在内存里的缓存数据(例如数据块,日志条目)。

 

Oracle的内存结构主要包括两大类,即SGAPGA,还有一类内存结构,叫UGA

1.1SGA

1.1.1SGA概述

SGASystem Global Area的缩写。

1.1.1.1SGA定义

一个Oracle instanceSGA,由包含数据和控制信息的一组共享内存结构组成。如果有多个用户同时连接到该instance,那么SGA里的数据对这些用户来说,都是共享的,因此,SGA也有时候也叫Shared global area

(一个Oracle instance1SGAoracle进程组成,每个instance有自己独立的一个SGA

 

1.1.1.2SGA公共特性

◆当启动instance时,Oracle自动为SGA分配内存;当shutdown instance时,操作系统自动回收分配给SGA的内存。

SGA被所有的serverbackground进程共享。SGA是可读/写的。连接到多进程数据库instance的所有用户,都可以读取在SGA里的信息。

如果Oracle部署为shared server结构,那么一些查询的请求和响应信息以及PGA的一些其他信息就会放入SGA

◆为了性能更好,在大多数系统里,SGA的全部大小都应该在物理内存里。否则,如果有虚拟内存用来存储SGA的一部分,因为这部分SGA会被操作系统paged(读写到磁盘),整个数据库的系统性能就会明显的下降,SGA里所有的共享区域的性能都会受到影响。所有性能下降时,也要检查系统的swap是否正常。可以使用LOCK_SGA参数把SGA锁定在物理内存里。

SGA的大小,由一些初始化参数的的大小来决定,最能影响SGA大小的初始化参数是:DB_CACHE_SIZELOG_BUFFERSHARED_POOL_SIZELARGE_POOL_SIZE

SGA的大小,使用sqlplus启动instance时会显示出来,或在sqlplus里使用SHOW SGA命令即可显示出来。

oracle可以在默认SGA配置下启动,并且允许通过增加SGA组件的内存大小来增加SGA的大小,整个SGA可以使用的最大值受SGA_MAX_SIZE初始化参数的限制。如果在启动instance初始化内存的时候,设置的SGA_MAX_SIZE参数比SGA组件的内存之和要小,或者使用SGA_MAX_SIZE的缺省设置,那么在instance启动后,SGA_MAX_SIZE会被设为sga组件值之和,原值被覆盖。

zero_plus

1.show parameter 看见的是当前生效的值,即memory级别的parameter

2.sga_targetsga中其他参数的关系:10g增加了sga_target参数,如果该参数为0,则必须制定db_cache_size等参数的值;如果该参数不为0,则如果db_cache_size0db启动时根据sga_targetSGA_MAX_SIZE的值分配sga的各个组件,如果db_cache_size不为0,则分配不小于该值的cache大小,其他sga组件同理。

3. db_cache_size的扩大和缩小,当扩大时立即生效;缩小时不立即生效,在sga_target的值变小时,适量缩小。

4.如果sga_target被改为0,则关闭数据库时当前的sga各组件的大小会被写入spfile中。

5.如果sga_target被改为非0,在不重启的情况下生效吗?

 

 

1.1.1.3SGA组成部分

SGA逻辑分为3大块:Fixed SGAStatic SGADynamic SGA,分别描述如下。

 

1.1.1.1.1Fixed SGA

做为SGA的一部分,所有background进程都需要访问它,有关databaseinstance的常规状态信息,包括进程间的通讯信息,例如锁信息,就组成了Fixed SGAFixed SGA里不包含任何用户数据,启动数据库后,Fixed SGA的大小就固定不变了。

 

1.1.1.1.2Static SGA 

即需要重新启动数据库才生效,包括Redo log bufferJava pool

 

1.1.1.1.3Dynamic SGA

不需要执行shutdown instance就可以更改的SGA内存区域。Dynamic SGA包括:Database buffer cacheShared poolLarge pool(optional)这几个内存组成部分。

zero_plusshow sga显示的Variable Size是指哪一部分:共享池+LARGE+java池(除db_cachelog­_buffer外的sga区域)+空闲sga

Dynamic SGA的可设置大小受虚拟内存大小的限制。Dynamic SGA提供了从外部控制(增加或减少)Oracle使用内存的方法,它允许DBA发布语句增加或缩小SGA到操作系统允许的最大值和SGA_MAX_SIZE的指定值,或缩小到Oracle规定的最小值。同时,也会根据一些内部的Oracle管理策略,在运行时,SGA内存组件的大小自动增加或缩小。

 

1.1.1.1.3.1granule

Dynamic SGA的所有内存组件与物理内存之间分配或释放的最小单位叫granulestatic内存java pool也使用granule为单位分配或释放内存),Dynamic SGA的组件都是granule的整数倍。有关granule的所有信息,都存储在一个相应的granule entry里,Oracle在这个granule entry里维护所有的granule状态。

 

Granule的大小由总SGA的大小决定,对于大多数系统来说,如果总的SGA大小小于128M,那么granule4M,否则为16M。但也受一些操作系统的影响,比如32bitWindows NT,如果总的SGA大于128M,则granule8M。可以查看V$SGA_DYNAMIC_COMPONENTS视图查看当前正在使用的granule大小,所有的Dynamic SGA组件都使用同样大小的granule为分配和释放单位。(如果的Dynamic SGA组件的大小不为granule的整数倍,则Oracle自动把组件大小设置=“(原设置大小%granule+1)*granule

(我的IBM笔记本,fedora core5,oracle 10gSGA总大小超过160M,但granule还是为4M,很奇怪。在SUN 64-bit上,SGA大于2Ggranlue16M

 

Oracle使用一个scoreboard来分别记录这些Dynamic SGA组件和这些组件的granules的相关信息,对于每个Dynamic SGA组件自己的granulesscoreboard包含了分配给该组件的granule个数,要扩展的granules大小,所有的这些信息,从oracle instance启动开始就进行了记录。对于每个Dynamic SGA组件,Oracle维护granules的初始个数以及最大个数,Oracle对于改变的granule个数,同时在scoreboard进行了记录,记录了这个操作,改变的大小,和开始改变的时间,Oraclecoreboard里逐步更新这些过程,直到该修改操作完成。当修改完成后,Oracle使用修改的目的大小来替换当前大小,并且清除掉target size fieldprogress fieldOracle会更新初始化参数值以反映被更新的SGA大小,这个操作结束后,DBA就可以查看到有多少granule被修改了。Oracle维护一个circular buffer来记录最后100次对scoreboard的操作,v$sga_dynamic_components就可以看到这些内容。

 

在启动instance时,Oracle读取初始化参数文件的Dynamic SGA相关设置大小,查询操作系统内存限制,并且为这些SGA组件分配虚拟地址空间。SGA_MAX_SIZE如果不被忽略,那么该参数就指定了在整个instance活跃期SGA可以使用的最大值了,单位是bytes

 

DBA可以使用ALTER SYSTEM语句来更改初始化参数文件里的Dynamic SGA组件的大小,Oracle接收到要改变的大小值(target size),并且会把该组件大小逐步扩增或缩小到最近的一个granule的整数倍,最后修改到指定的target size。但Oracle必须有足够free granule来满足请求,如果当前SGA大小小于SGA_MAX_SIZE大小,那么Oracle可以分配更多的granules直到SGA大小达到SGA_MAX_SIZE。(这些变化都可以在v$sga_dynamic_components视图里看到)

 

注意,java pool虽然是静态参数,但他的内存分配规则,也是按照granule为单位分配的。

zero_plus:java_pool10g中是动态的,在9i中是静态的)

 

1.1.1.1.4其他一些SGA控制参数

LOCK_SGA参数,指定把SGA锁定在物理内存里。

SHARED_MEMORY_ADDRESSHI_SHARED_MEMORY_ADDRESS参数,同时使用某一个,来指定SGA的内存运行开始地址,通常不使用这两个参数(缺省为0),而使用操作系统设置的开始位置。

USE_INDIRECT_DATA_BUFFER,可以让SGA32-bit的平台使用超过4G的物理内存但由于每个buffer都要求有一个有效的虚拟地址,所以在当前版本该参数无效

1.1.1.1.5Database Buffer Cache活动统计值

一般可查看V$DB_CACHE_ADVICE[a1] Buffer cache hit ratio[a2] 来观察Database Buffer Cache的活动情况。

 

 

1.1.2Database Buffer Cache

Database Buffer Cache保存了从datafile拷贝来的data blocks。所有当前连接到instance的用户进程都可以共享访问database buffer cache

要想有效的利用database buffer cache,应用程序的SQL语句就应该被优化以减少不必要的资源消耗,通常,经常执行的SQL语句和发生大量buffer getsSQL语句应该被优化。

database buffer cacheshared SQL cache被逻辑地组织为segments放入multiple sets,在多处理器系统,这样可以减少系统竞争。(zero_plus:segment跟表的segment对应吗?)

 

1.1.2.1组织结构

database buffer cache里的buffer,被组织到两个list里:write listleast recently used list(简称为LRU)。一个buffer对应一个db_block_size大小。

 

Write list

保存的是dirty buffers,是已经被修改了但还没有写进磁盘的数据。

LRU list

保存的是free bufferspinned buffers,和还没有被移到write listdirty buffers

free buffers还没有包含任何有用的数据,可以被用来存储从datafile拷贝来的数据。

pinned buffers是当前正在被访问的buffers

 

1.1.2.2工作原理

当一个oracle user process需要访问dataparticular piece时,oracle user process先通过mutiple sets里的段结构在cache里搜索buffer,如果发现data已经在cache里了(也就是发生一次cache hit),该进程会把这个buffer移到LRU的头部(即使用most recently used MRU的方法),同样地,相关的更多的buffer会继续移到LRU的头部,相对地,dirty bufersLRU的位置就会向LRU list的尾部移动,减少在cache里的寿命,然后就可以立即从内存里读到数据;如果在cache里找不到data(也就是发生一次cache miss),那么在访问这个数据前,它必须先从磁盘上的datafile把需要访问的data block拷贝到cache里的free buffer里,然后再访问。所以cache hitcache miss访问要快。

 

如果是cache miss,那么在从磁盘上拷贝data block前,user process会先在LRU list里搜索free buffers来存放将从磁盘上的datafile 拷贝的data blockuser processLRU list的尾部开始搜索,直到找到一个free buffer或直到搜索到buffers的门限值。在搜索的过程中,如果user process发现一个dirty buffer,它会把这个dirty buffer移到write list,然后继续搜索。如果找到了free buffer,那么它会从磁盘读取data block到这个搜到的free buffer里,然后把这个被写入数据的buffer移到LRU list的头部。如果搜到buffer的门限值都还没找到free bufferuser process会停止搜索,并且发一个信号给DBW0后台进程来把write list里的dirty buffer写到磁盘上,以得到free buffer

但是特殊地,对于全表扫描,从table里读出放入到buffer的数据,由于全表扫描通常仅仅是很少发生,这些buffer会被放到LRU list的尾部,以让这些包含全表扫描数据的buffer更快的离开经常需要访问的buffer。但你可以控制这种算法,通过对tableclustercreatealter的时候指定cache子句,那么全表扫描时,这些buffer就会放到LRU list的头部了

 

1.1.2.3大小设置

Database buffer cache的设置,是与database block size的设置相对应的。

一般优化一个instance时,知道正确的buffer cache大小是很重要的,典型的做法是,在开始时估计一个buffer cache大小值,然后运行一些具有代表性的程序,并且测试、观察相关统计数据,来判断估计值比优化值小还是大,逐步调整,最终优化。

Oracle支持多种Database block size的大小,有效范围从2K32K(由参数db_block_size设置),system表空间的block size是数据库block的缺省大小,db_block_size参数设置的是标准大小。

 

有标准和非标准block size,与之对应的,由db_cache_size参数来设置标准的database buffer cache来与标准的block size对应。非标准的block sizeDB_nK_CACHE_SIZE[a3] 参数来与之对应。(会有一些操作系统平台限制最大块的大小,所以一些db_block_size的大小在2K32K的范围里是受到限制的)(zero_plus:如何使用非标准块)

 

db_cache_size永远与标准block size相对应,与此同时,不再允许设置与标准块大小一样的DB_nK_CACHE_SIZE参数。

 

V$BUFFER_POOL可以查看这些变化。

 

 

 

 

 

1.1.2.4使用多种buffer pool

可以把database buffer cache配置成多个独立的buffer pool,比如可以一直把data保存在buffer cache--keep buffer pool,可以让新数据一来立即就可获得free bufferrecycle buffer pooldatabase buffer cache缺省只使用一个pool,即default buffer pool。(可查看user_segments视图知道schema object对应的是那个buffer pool,缺省是default pool)。

标准block size可以配置最多3buffer pool,即keep,default,recycle3buffer pool,至少配置一个default buffer pool,而非标准的block size,只允许配置一个default pool

 

KEEP BUFFER POOL[a4] 

schema objects data blocks保存在内存里。设置参数DB_KEEP_CACHE_SIZE,是dynamic sga参数。(zero_plus:这个参数是干嘛的--buffer_pool_keep—8i

RECYCLE BUFFER POOL

一旦不需要访问的data blocks,就会被从内存里清除掉。设置参数DB_RECYCLE_CACHE_SIZE,是dynamic sga参数。(zero_plus:这个参数是干嘛的--buffer_pool_recycle

DEFAULT BUFFER POOL

保存的是没有与keep,recycle关联的schema objectsdata blocks,对象一般都是明确指定是default的。DB_CACHE_SIZEDB_nK_CACHE_SIZE参数。

 

 

1.1.3Redo Log Buffer

组织结构:

Redo log buffer包含了有关对数据库的更改的信息,是一个circular buffer

这些信息都存储在redo entries里。

redo entries包含数据库被INSERT,UPDATE,DELETE,CREATE,ALTER,DROP操作修改了的数据库重构、重做的必要信息。在数据库恢复时它们就很有用了。

 

工作原理:

oracle server processSGA里的users memory space拷贝到redo log bufferredo entrieslog buffer里连续的空间,再由LGWR后台进程把redo log buffer[a5] 写到活动的online redo log fileor group of files)里。

 

大小设置:

LOG_BUFFER参数设置redo log buffer的大小,对于一些长事务或事务很多的系统,log buffer一般设大一点,缺省值一般根据CPU_COUNT来决定,(不是512K就是128K*CPU_COUNT

zero_plus:参数db_block_buffers何用

 

1.1.4Shared Pool

Shared pool包含3个主要区域:library cachedictionary cache、并行执行的消息buffer和控制结构。

 

1.1.4.1组织结构和工作原理

Library cache

Library cache包括如下区域:

Shared SQL areas:所有用户都可以访问。shared SQL area里,保存一个SQL语句的parse treeexecution plan。当一个新的SQL语句被解析时,oracleshared pool里分配内存,存储为shared SQL area,分配的内存大小依赖于SQL语句的复杂程度,如果所有的sahred pool都被分配完了,那么Oracle会使用LRU的方法清除一些内存项,直到有足够的空间来分配给新SQL语句的shared SQL area。如果Oracle清除了一个shared SQL area,那么在这个SQL下次执行时,必须被重新解析和关联到其他的shared SQL area。(zero_plus:确定共享级别的参数是哪个[a6] 

Private SQL areas(多事务系统):这部分属于PGA了。

PL/SQL procedures and packagesOracle processPL/SQL程序是以procedures,functions,packages,anonymous blocks,triggers为单位的。对于一个PL/SQL程序,Oracle分配一块shared area来保存它的parsedcompiled form,分配一块private area来保存执行该PLSQL程序的会话所指定的值,包括local,globalpackage变量(如package实例)和执行SQL语句的buffers。如果同时有多个用户执行同一个PL/SQL程序,那么该PL/SQL程序只有一个shared area供大家共享,但每个用户有自己独立的一个private area拷贝来保存自己会话私有的信息。而对于process PL/SQL程序来说,它们都是process SQL语句,忽略这些SQL语句属于那个PL/SQL程序,它们都有自己的shared SQL areaprivate SQL area

Control structures(例如locks,library cache handles

 

Oracle通过一个shared SQL area和一个private SQL area来描述每条它运行的SQL语句[a7] ,当多个用户同时执行相同的SQL语句时,他们共享该SQLshared SQL area,但每个用户都单独有一个shared SQL area的拷贝,即独立的private SQL area

 

Dictionary cache

数据字典是一组数据库表和视图,他们包含了有关数据库的结构,用户等的相关信息。在SQL语句解析时会频繁的访问数据字典,操作数据库必不可少的要访问数据字典。

由于数据字典被oracle经常访问,所以在内存里有两个专有的存储单元被指定用来保存字典数据。一个存储单元叫做data dictionary cache,和row cache(以rows的方式代替使用bffuerbuffer保存数据是保存数据的全部blocks)方式来保存数据)一样的管理方式,另外一个保存字典数据的区域是library cache。所有的oracle用户进程访问数据字典信息时都共享这两个cache

 

Parallel execution messages buffers and control structures

 

 

 

通常情况下,任何shared poolitem(即shared SQL area or dictionary row)都会被保留,直到他们依据LRU方法被flushed掉。当有新的item需要从shared pool里分配空间时,那些空闲的内存并不是被有规则的分配给item的。只要它们有用,LRU方法会一直让那些被很多会话使用的shred pool items保留在内存里,即使创建这个items的原始进程已经terminates。因为这样,一个多用户的数据库系统的总体开销和SQL相关的开销才会最小化。

 

当一个SQL语句被提交给oracle执行时,Oracle会自动完成下列分配内存的步骤:

1Oracle检查shared pool看是否有一个相同SQL语句的shared SQL area已经存在了,如果存在,那么这个shared SQL area就会被用来执行,否则,Oracle分配一个新的shared SQL area来保持该SQL语句的parse treeexecution plan以上两种情况,users private SQL area都会被associated到包含该SQL语句的shared SQL area

Shared SQL area可以被从shared poolflushed掉,即使该shared SQL area对应的是一个打开的但有一段时间没有被使用的cursor。当该打开的cursor后来被用来执行所对应的[a8] SQL语句时,Oracle会重新解析该SQL语句,这个SQL语句的shared SQL area会在shared pool里重新分配

2Oracle会分配一个private SQL area来代表一个独立的会话的执行,private SQL area的分配位置,即在什么SGA组件里分配,依赖于会话连接的类型[a9] 

 

在以下几种情况,Oracle也会从嗯shared poolflushed shared SQL area

◇当发布ANALYZE分析语句来更新或删除table,cluster,index的统计数据时,shared pool里所有的shared SQL area,如果包含的语句与该被分析schema object相关,则会被flushed掉,下一步,一条flushed语句会被运行,被删除的shared SQL area里的语句会被重新解析,并且放入到新的shared SQL area里以反应新的shcema object统计数据。

◇如果一个schema object被任何形式的修改后,在shared pool里与之相关的任何shread SQL area都会被标记为无效,在下次执行时,都会被要求重新解析。

◇如果修改了global database name[a10] ,那么shared pool里所有的信息都会被flushed

◇通过ALTER SYSTEM FLUSH SHARED_POOL;语句,DBA可以手工从shared poolflushed所有信息。

 

 

1.1.4.2大小设置

Shared pool的总体大小由参数SHARED_POOL_SIZE来设置,缺省下,32-bit系统为32M64bit系统为64M.

 

1.1.5Large Pool[a11] 

DBA可以配置一个optional memory area,即large pool来为下列工作提供large memory

Shared server的会话内存,和Oracle XA接口(即超过一个数据库里的事务之间的关系)

I/O服务进程

Oracle备份和恢复操作

■并行执行的消息buffer(如果PARALLEL_AUTOMATIC_TUNING=true,如果是false,那么该内存会在shared pool里分配)

 

通过配置large poolOracleshared pool可以只要缓存shared SQL和避免缩小shared SQL cache的性能开销。

一般,给Oracle备份和恢复,I/O服务进程,并行buffer分配的内存有几百Klarge poolshared pool更能满足这些内存请求。

Large pool没有LRU list,这和shared pool不一样。shared pool里所有的内存分配,都使用同一个LRU list

 

 

 

1.2PGA

PGAProgram Global Area的缩写,是一个包含server process的数据和控制信息的内存区域,它是非共享的,即每个serverbackground进程,都有一个自己的PGA,在server process启动时由Oracle创建,它的读写都只由server process自己完成,一般包括Stack aresData areas等内存区域。

 

PGA的组成部分,依赖于instance是否运行在shared server option,但通常说的PGA,包括如下部分Private SQL AaraSession MemorySQL Work areas

 

DBA可以简单的,只需要设置PGA_AGGREGATE_TARGET参数来指定PGA的总大小即可,这样PGA的各内存模块大小就会被Oracle自动和全局管理了。(WORKAREA_SIZE_POLICY参数值缺省为auto,也只有在autoPGA_AGGREGATE_TARGET*_AREA_SIZE的分配管理才生效)

 

1.2.1Private SQL Area

一个private SQL area包含了例如邦定信息和运行时内存结构等数据。每个发布SQL语句的会话都有一个private SQL area。如果同时有多个会话,即使发布相同的SQL语句,他们也有自己的private SQL area,同时共享一个shared SQL area

 

在一个private SQL area的生命期里,它被划分为两个区域:

永久区域:包含了如邦定信息,只有在private SQL areacursor关闭时才会释放[a12] 

◆运行时区域:在cursorSQL语句执行结束后,即释放。

 

第一步是创建运行时区域,对于INSERTUPDATEDELETE语句,在语句执行结束后即释放运行时区域,对于查询语句,只有在所有行被fetch或查询取消后才会释放运行时区域。

Private SQL area在什么内存模块分配,取决于连接的会话是什么类型,如果是dedicated server,那么private SQL areaserver processPGA。如果是shared server,那么private SQL areaSGA里分配。

 

1.2.1.1cursorSQL Areas

Oracle预编译程序(比如PL/SQL程序)或OCI程序会显式打开的cursor,或handles,会来指定一个private SQL areas,这些程序执行时,会把他们做为一个命名资源来使用。为一些SQL语句而执行的Oracle递归操作隐式打开的cursor,也使用shared[a13]  SQL areas

 

Private SQL areas是由user process管理的。分配和回收private SQL areas很大程度依赖于你使用的是什么应用程序工具,user process能分配的private SQL areas的个数由OPEN_CURSORS指定,缺省值是50

 

整个private SQL area(主要是永久区域)直到cursor关闭或SQL句柄释放才会释放,应用程序关闭那些将不再被使用的cursors来释放private SQL area以及减少应用程序用户请求的内存大小。

 

注释:cursor就是private SQL area的一个句柄或名字。

 

1.2.2Session Memory

Session memory是分配来保存会话变量(即登录信息)和其他一些与会话相关的信息的内存区域。如果是shared server模式,session memory是共享的,而不是private的。(zero_plus[a14] :虽然是共享的,但任然保存在pga)

 

1.2.3SQL Work areas

一些复杂的查询(比如descision-support queries),private SQL area的运行时区域会有一个大的部分被独立成SQL work areas,由如下memory-intensive操作来分配:

★排序操作(order by,group by,rollup,window function

hash连接

bitmap merge[a15] 

bitmap create[a16] 

 

例如,排序操作使用SQL work area(一些时候被叫做sort area)来完成内存排序。hash-join操作使用SQL work area(也叫做hash area)来完成把从左边输入的数据创建成一个hash table。如果要sort的数据或创建hash table的数据太大,装不进SQL work area,那么这些数据会被分为一些小的pieces,这样就可以让一些data pieces在内存里操作,其他data pieces暂时被存入temp表空间,稍后被取到内存进行sorthash操作。

但是bitmap操作不一样,如果SQL work area相对太小,他们不会被分成pieces暂时存入temp表空间,他们相反的,会复杂的调整到适合SQL work area大小来执行bitmap操作。

所以,sort,hash,bitmap可以更快的在large SQL work area里执行。

 

SQL work area的大小可以控制和调整。通常,较大的SQL work areas可以明显的改善性能,特别是SQL work area对于输入数据来说足够大时,和一些辅助性的内存结构被相关操作分配后,性能提高就很明显,否则,由于一部分输入数据要被临时写入temp表空间,导致在SQL work area里的操作响应时间就要增加了。极端情况下,比如SQL work areas对于输入数据来说很小很小,那么输入数据就会被划分成很多个pieces,这时就会非常明显的增大SQL work areas里操作的响应时间了。

 

在早期的版本里,DBA通过设置如下参数来控制SQL work area的大小:

SORT_AREA_SIZE,HASH_AREA_SIZE,BITMAP_MERGE_AREA_SIZE,CREATE_BITMAP_AREA_SIZE

但设置这些参数是比较困难的,因为这4种操作里,针对每一类里的每次操作,要完美的设置好大小和SQL work area的个数就很困难,这时就很难设置这些*_AERE_SIZE的大小。

 

而通过PGA_AGGREGATE_TARGET参数设置PGA大小,在dedicated sessionswork areas都是自动分配的,4*_AREA_SIZE参数会被忽略,任何时刻,可以分配给SQL work areasPGA大小都自动由PGA_AGGREGATE_TARGET参数值分配得到。可以分配的大小是PGA_AGGREGATE_TARGET参数值减去已经使用了的和。

 

注意:

1)缺省值为autoWORKAREA_SIZE_POLICY参数是会话和系统级的,当设置了PGA_AGGREGATE_TARGET*_AREA_SIZE后,可以在系统级和会话级把WORKAREA_SIZE_POLICY修改为manual值,从而使用*_AREA_SIZE参数来分配*_AREA_SIZE参数指定的内存大小,这些大小不再从PGA_AGGREGATE_TARGET里分配。

2shared serverwork ares的大小不是PGA_AGGREGATE_TARGET参数分配了,因为在shared serverwork areas将在SGA里分配。所有在shared serverwork area仍然是由*_area_size参数控制

3)一些时,work areas在一些书上会叫做process-private memory

 

1.3UGA

 

 

 

 

 

 

1.4Software Code Areas

Software code area是用来存储Oracle软件code的内存区域,存储的是正在运行的code或将运行的codecode area根据应用程序存储在不同的区域-独占区域,保护区域。其大小一般是静态大小,只有在软件更新或重新安装后其需要的大小才会改变,需要的大小由操作系统来更改。

Software areas是只读的,可以被安装成共享和非共享,只要可能,都是共享的,以让所有的用户访问而不需要在内存里使用多个拷贝,这样可以减少物理内存使用和提高性能。如一些如SQL*PlusSQL*FormsOracle toolsutilities可以共享,但一些不能共享。当在同一个机器上运行多个多个instances操作多个database时,相同的oracle code就可以共享。

注意:并不是所有操作系统都支持oracle code共享的,如windows pc就不支持。

 

 

 

 

1.5参考信息

1.5.1相关视图汇总

1.5.1.1SGA参考试图

1.1.1.1.6V$SGA_DYNAMIC_COMPONENTS

1.1.1.1.7V$SGA_CURRENT_RESIZE_OPS

1.1.1.1.8V$SGA_RESIZE_OPS

1.1.1.1.9V$SGA_DYNAMIC_FREE_MEMORY

1.1.1.1.10V$BUFFER_POOL

1.5.1.2PGA参考视图

1.1.1.1.11V$SYSSTAT

1.1.1.1.12V$SESSTAT

1.1.1.1.13V$PGASTAT

1.1.1.1.14V$SQL_WORKAREA

1.1.1.1.15V$SQL_WORKAREA_ACTIVE

1.1.1.1.16V$PROCESS

 

1.5.2相关初始化参数汇总

1.5.2.1SGA_MAX_SIZE

1.5.2.2LOCK_SGA

1.5.2.3SHARED_MEMORY_ADDRESS

1.5.2.4HI_SHARED_MEMORY_ADDRESS

1.5.2.5USE_INDIRECT_DATA_BUFFER

1.5.2.6DB_BLOCK_SIZE

1.5.2.7DB_CACHE_SIZE

1.5.2.8DB_nk_CACHE_SIZE

1.5.2.9DB_KEEP_CACHE_SIZE

1.5.2.10DB_RECYCLE_CACHE_SIZE

1.5.2.11LOG_BUFFER

1.5.2.12CPU_COUNT

1.5.2.13SHARED_POOL_SIZE

1.5.2.14PARALLEL_AUTOMATIC_TUNING

1.5.2.15PGA_AGGREGATE_TARGET

1.5.2.16WORKAREA_SIZE_POLICY

1.5.2.17SORT_AREA_SIZE

1.5.2.18HASH_AREA_SIZE

1.5.2.19BITMAP_MERGE_AREA_SIZE

1.5.2.20CREATE_BITMAP_AREA_SIZE

1.5.2.21OPEN_CURSORS

 


 [a1]Zero_plus:该视图怎么用?

 [a2]怎么查看?

 [a3]如何使用非标准块

 [a4]怎么把对象放到keeprecycle池中

 [a5]COMMIT ckpt

 [a6]cursor_sharing它必须来自 SIMILAR, EXACT, FORCE 之间,此三个值的含义?

 [a7]Shared sql area保存执行计划,private sql area保存变量或完整的sql语句

 [a8]说明游标是private sql area中的一条sql语句,它的执行计划在shared sql 中。所以open_cursors应该是在一个会话中最大的打开游标数。

 [a9]如果是共享会话它在sga中,如果是独享会话它在PGA

 [a10]是监听器里的吗

 [a11]Large池没有lru list,运行机制与共享池不一样,所以在Oracle备份和恢复,I/O服务进程,并行bufferlarge应该被用来代替共享池

 [a12]所以一定要关游标

 [a13]应该是private

 [a14]应该是吧

 [a15]Merge没有最优、一遍、多遍之说。

 [a16]什么是产生