PGA内存管理 进程全局区是个包含服务器进程的数据和控制信息的专用内存区域。例如,当一个游标打开的时候,PGA内存就会新创建一块区域给予服务器进程利用。这里要注意,当你使用shared server的时候,有一部分PGA内存会保存到SGA中。 下列的操作会使用到PGA: ■ 排序, 诸如 ORDER BY, GROUP BY, ROLLUP, 和window functions ■ Hash-join ■ Bitmap merge ■ Bitmap create ■ 使用bulk load 操作写缓存 排序操作会使用一个工作区(排序区)来完整数据行的内存排序。同样的,hash join操作也使用一个类似的一个工作区来工作。 这个工作区的大小可以控制和调整。一般来说,更大的工作区能够改善一个内存消耗高的操作的性能。理论来说,工作区的大小如果和SQL的需求一致,那么将获得很好的性能。如果不足,则会增加响应的时间,影响性能。 自动PGA内存管理简化和改进了PGA内存的分配。默认情况下,这个特性是开启的。Oracle动态的调整PGA内存分配给工作区的大小,基本是20%SGA的大小,最小10M。 -配置PGA自动管理 在自动模式下,*_AREA_SIZE参数都会被忽略,通过设置PGA_AGGREGATE_TARGET的大小来启动自动管理。 但你创建一个全新的实例的时候,是很难精确的确定PGA_AGGREGATE_TARGET的大小的,但是你可以通过下面的步骤来判断: 1.最初可以设置为SGA的20%大小。注意,在DSS系统中,这个值可能不足。 2.在实例运行的正常负载情况下,收集PGA的统计信息,判断PGA的最大大小是否超出配置。 3.调整PGA_AGGREGATE_TARGET,使用Oracle 的PGA 顾问统计。 下面的章节将详细解释这三个步骤。 -PGA_AGGREGATE_TARGET初始化设置 PGA_AGGREGATE_TARGET的值应该基于Oracle实例可利用内存的总量来设置。这个参数可以被动态的修改。下面将列举一个典型的案例。 假设Oracle实例可分配4GB的物理内存。剩下的内存分配给操作系统和其它应用程序。你也许会分配80%的可用内存给Oracle实例,3.2G。 现在必须在内存中划分SGA和PGA区域。 在OLTP系统中,典型PGA内存设置应该是总内存的较小部分(例如20%),剩下80%分配给SGA。 OLTP: PGA_AGGREGATE_TARGET = (total_mem * 80%) * 20% 在DSS系统中,由于会运行一些很大的查询,典型的PGA内存最多分配70%的内存。(在上面的例子中,最多为2.2GB) DSS: PGA_AGGREGATE_TARGET = (total_mem * 80%) * 50% 在这个例子中,总内存4GB,DSS系统,你可以设置PGA_AGGREGATE_TARGET为1600MB,OLTP则为655MB。 -监控自动PGA内存管理的性能 在开始调整之前,你应该知道如何监控和分析Oracle PGA内存统计。下面几个动态性能视图是为了这个目的: ■V$PGASTAT 这个视图给出了一个实例级别的PGA内存使用和自动分配的统计。 SELECT * FROM V$PGASTAT; NAME VALUE UNIT -------------------------------------------------------- ---------- ------------ aggregate PGA target parameter 41156608 bytes 当前PGA_AGGREGATE_TARGET的值 aggregate PGA auto target 21823488 bytes 当前可用于自动分配了的PGA大小 global memory bound 2057216 bytes 自动模式下工作区域的最大大小。Oracle根据工作负载自动调整。 total PGA inuse 16899072 bytes total PGA allocated 35014656 bytes PGA的最大分配 maximum PGA allocated 136795136 bytes total freeable PGA memory 524288 bytes PGA的最大空闲大小 PGA memory freed back to OS 1713242112 bytes total PGA used for auto workareas 0 bytes PGA分配给auto workareas的大小 maximum PGA used for auto workareas 2383872 bytes total PGA used for manual workareas 0 bytes maximum PGA used for manual workareas 8470528 bytes over allocation count 291 实例启动后,发生的分配次数 bytes processed 2124600320 bytes extra bytes read/written 39949312 bytes cache hit percentage 98.15 percent 命中率 ■ V$PROCESS 这个视图显示了所有连接到实例的Oracle进程。 ■ V$PROCESS_MEMORY 这个视图显示了每个Oracle进程使用动态PGA的组成。它包含6种类型的行 java PLSQL OLAP SQL,Freeable由操作系统分配的内存,Other。 ■ V$SQL_WORKAREA_HISTOGRAM ■ V$SQL_WORKAREA_ACTIVE ■ V$SQL_WORKAREA 下面这个sql将查询出在工作区中使用cache最多的前10条SQL SELECT * FROM ( SELECT workarea_address, operation_type, policy, estimated_optimal_size FROM V$SQL_WORKAREA ORDER BY estimated_optimal_size ) WHERE ROWNUM <= 10; 下面的SQL监视正在执行的游标的情况 col sql_text format A80 wrap SELECT sql_text, sum(ONEPASS_EXECUTIONS) onepass_cnt, sum(MULTIPASSES_EXECUTIONS) mpass_cnt FROM V$SQL s, V$SQL_WORKAREA wa WHERE s.address = wa.address GROUP BY sql_text HAVING sum(ONEPASS_EXECUTIONS+MULTIPASSES_EXECUTIONS)>0; col "O/1/M" format a10 col name format a20 SELECT operation, options, object_name name, trunc(bytes/1024/1024) "input(MB)", trunc(last_memory_used/1024) last_mem, trunc(estimated_optimal_size/1024) optimal_mem, trunc(estimated_onepass_size/1024) onepass_mem, decode(optimal_executions, null, null, optimal_executions||'/'||onepass_executions||'/'|| multipasses_executions) "O/1/M" FROM V$SQL_PLAN p, V$SQL_WORKAREA w WHERE p.address=w.address(+) AND p.hash_value=w.hash_value(+) AND p.id=w.operation_id(+) AND p.address='88BB460C' AND p.hash_value=3738161960; SELECT address, hash_value FROM V$SQL WHERE sql_text LIKE '%my_pattern%'; 调整PGA_AGGREGATE_TARGET Oracle提供了两个视图来帮助调整PGA_AGGREGATE_TARGET。 ■ V$PGA_TARGET_ADVICE ■ V$PGA_TARGET_ADVICE_HISTOGRAM 例如查询V$PGA_TARGET_ADVICE SELECT round(PGA_TARGET_FOR_ESTIMATE/1024/1024) target_mb, ESTD_PGA_CACHE_HIT_PERCENTAGE cache_hit_perc, ESTD_OVERALLOC_COUNT FROM V$PGA_TARGET_ADVICE; The output of this query might look like the following: TARGET_MB CACHE_HIT_PERC ESTD_OVERALLOC_COUNT ---------- -------------- -------------------- 63 23 367 125 24 30 250 30 3 375 39 0 500 58 0 600 59 0 700 59 0 800 60 0 900 60 0 1000 61 0 1500 67 0 2000 76 0 3000 83 0 4000 85 0 配置OLAP_PAGE_POOL_SIZE OLAP_PAGE_POOL_SIZE参数的大小指定了OLAP会话用于分页的缓存的最大值。 不过,最好是设置足够的buffer cache,而不是它。一般它的大小是4M。
Oracle内存配置,是我最近看Oracle文档的一些笔记,总结得简略不当之处请多指教。至此内存配置系列结束。
原文:http://valen.blog.ccidnet.com/blog-htm-itemid-159282-do-showone-type-blog-uid-51502.html |