实例的内存结构
Oracle 实例的组成包括称为系统全局区域(SGA)的共享内存块,以及大量的后台线程。
用户会话还需要服务器端的内存,此内存不共享,称为程序全局区域(PGA)每个会话都有自己专用的PGA
SGA包含的数据结构
SGA 至少包含三个数据结构:数据库高速缓存区
日志缓冲区
共享池
还可能包括
大池
Java池
流池
参数:java_pool_size :控制java池的大小
Shared_pool_size :在某种程度上控制共享池的大小
Large_pool_size :控制大池的大小
Db_*_cache_size : 共有8个cache_size参数,控制各个可用的缓冲区缓存的大小
Log_buffer:在某种程度上控制重做缓冲区的大小
Sga_target:oracle10g及以上版本中用于izidongSGA内存管理
Sga_max_size:用于控制数据库启动并运行时SGA可以达到的最大大小。
数据库高速缓存区数据库高速缓存区是oracle用来执行sql的工作区域。
Oracle处理更新的步骤:
更新数据时,用户的会话不直接更新磁盘上的数据。包含关键数据的数据块首先复制到数据库高速缓存区。更改应用于数据库高速缓存区中的这些数据块副本。此后,块将在缓冲中保留一段时间,直至其占有的缓冲区需要缓存另一个块为止。
Oracle 处理查询的步骤
查询时,会话计算出哪些块包含关键的行,并将它们复制到数据库高速缓存区;此后相关行传输到会话的PGA做进一步处理。与上面一样,此后块会在数据库高速缓存区中保留一段时间。
注意:缓冲区的更新频率与何时写回数据文件没任何关系,对数据文件执行写操作由数据库写入程序后台进程完成。
视图:V$LIBRARYCACHE
日志缓冲区日志缓冲区是更改矢量的小型短期临时区域,此后,更改矢量会写入到磁盘上的重做日志中。每当数据块发生更改时,都会将应用于块的更改矢量写回重做日志。
注:在oracle体系结构中,将日志缓冲区转储到磁盘是基本瓶颈之一,DML的速度不能超过LGWR将更改矢量转储到联机重做日志文件的速度。
参数:LOG_BUFFER
共享池 Shared Pool
共享池是SGA保留的区,用于存储如SQL、PL/SQL存储过程及包、数据字典、锁、字符集信息、安全属性等。
参数:SHARED_POOL_SIZE
库高速缓存 Library Cache库缓存是内存区域,保存有已经解析的格式存储最近执行的代码。Oracle通过解析语句来选择sql的最佳执行方式,也就是我们说的执行计划。
要Oracle优化库高速缓冲区,必须首先了解该缓冲区的活动情况。库高速缓冲区的活动统计信息保留在动态性能表V$LIBRARYCACHE中。优化时应使数据字典高速缓存里的内存数据库块尽可能多。
视图:V$LIBRARYCACHE 参数:SHARED_POOL_SIZE OPEN_CURSORS
(1)确定库高速缓存的性能
通过查询V$LIBRARYCACHE表(需有SELECT ANY TABLE特权)来了解其活动情况,以决定如何优化。说明:动态性能表V$LIBRARYCACHE中包含有NAMESPACE、PINS和RELOAD等列。其中NAMESPACE列反映了SQL语句及 PL/SQL块的库缓冲区的活动,其值可能是‘SQL AREA’,‘TABLE/PROCEDURE’,‘BODY’和‘TRIGGER’等;而PINS和RELOADS列给出执行调用时的错误信息。 PINS列给出SQL语句、PL/SQL块及被访问对象定义的总次数;RELOADS给出SQL语句或PL/SQL块的隐式分析或对象定义重装载时在库程序缓冲区中发生的错误。
(2)查看reloads和pins的比率
用户必须保证reloads和pins的比率尽可能低,其值应低于1%,若RELOADS/PINS>1%,则应给缓冲区分配附加的存储及写等同的SQL语句,使SQL语句与PL/SQL块共享一个共享SQL区,这样可减少错误。如果库高速缓冲区无错误,则可设置初始化参数 CUTSOR_SPACE_FOR_TIME为TRUE,以加速执行调用。这可使性能稍有改善。若每个用户可用的专用SQL区不足时,则不要将 CUTSOR_SPACE_FOR_TIME设置为TRUE
优化库高速缓存时,可以通过增加init.ora文件中SHARED_POOL_SIZE或OPEN_CURSORS的参数值而达到满意的优化比率。
字典高速缓冲区(Dictionary Cache )。
数据字典缓存存储最近使用的对象定义:表、索引、用户和其他元数据定义的描述。放在字典高速缓冲区可以避免从磁盘上的数据字典中重复读取他们,从而提高解析性能。
Sql查询与pl/sql函数结果缓存
结果缓存是11g版本的新功能,
结果缓存可以缓存 SQL 查询和 PL/SQL 函数结果,将其存储到内存中。同一查询或函数的后续执行可以直接从缓存进行,从而加快了响应时间。该方法对频繁执行的 SQL 查询和 PL/SQL 函数尤为有效。
默认情况下,服务器端结果缓存配置为使用很小一部分的共享池。您可以使用 RESULT_CACHE_MAX_SIZE 初始化参数手动设置结果缓存内存的大小。将 RESULT_CACHE_MAX_SIZE 设置为 0 将禁用服务器端结果缓存。
共享池的大小是动态的,可以对其进行自动管理
大池大池是可选的,如果创建了大池,那些在不创建大池的情况下使用共享池内存的不同进程将自动使用大池,大池的主要用途是供共享服务器进程使用,并行执行服务器也将使用大池。
设置大池的大小与性能无关。如果某个进程需要大内存池,而内存不够,则此进程将失败,并发生错误。如果分配的内存量超过需要,语句的运行速度并不会因此加快。
如果使用大池,不可能出现:某条语句开始使用大池,后来又因大池过小而恢复使用共享池。
大池的大小可以动态调整,而且可以自动管理。
Java池
只有在应用程序需要运行数据库中的java存储过程时,才需要java池:此池用于启用java对象所需的堆空间。
Java代码不在java池中缓存:java代码在共享池中缓存,与pl/sql代码的缓存方式相同。
Java池的最佳大小与java应用程序相关,也与运行其的会话数量有关.
相关参数: JAVA_POOL_SIZE
流池 流的使用机制是:从重做日志提取更改矢量,并使用 这些重新构造执行的语句,或具有相同效果的语句。 这些语句在远程数据库执行。从重做日志提取更改的过程,以及应用更改的过程将用到内存:此内存就是流池。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23754390/viewspace-701298/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/23754390/viewspace-701298/