增强了的v$process查看表 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
Oracle已经通过增强v$process查看表来实现内存监控。v$process查看表里的新数据列允许你显示当前所有Oracle进程的程序全局区(PGA)区域的细节。PGA是内存里的一个专门区域,被单独的进程用来执行内存密集型函数,例如排序。
v$process查看表的三个新数据列包括pga_used_memory、pga_allocated_memory和 pga_max_memory。从这些刻度表里,你可以看到Oracle环境里各个后台进程的实际内存利用率,还可以查看每个到数据库的连接所需要的内存。为了说明这个问题,考虑一下下面这个查询:
col c1 heading 'Program|Name' format a40 col c2 heading 'PGA|Used|Memory' format 999,999,999 col c3 heading 'PGA|Allocated|Memory' format 999,999,999 col c4 heading 'PGA|Maximum|Memory' format 999,999,999
select program c1,pga_used_mem c2,pga_alloc_mem c3,pga_max_mem c4 from v$process order by c4 desc; |
这个例子深入到了Oracle数据库引擎的行为中。例如,你可以看到Oracle的日志编写器(LGWR)进程是PGA内存最大的消耗者,其原因是很清楚的:Oracle的日志编写器进程必须把重做日志镜像(redo log image)从Oracle的日志缓冲器(在内存里)里传输到在线重做日志文件系统里。你还可以看到Oracle的数据库编写器(DBW0)进程也有很高的内存占用率,这也是有原因的:Oracle的异步I/O进程必须使用大量的内存资源来保证所有数据库的更改都被成功地写到数据库里。
各个进程所要使用的内存大小
在Oracle9i里查看内存使用的真实值就是查看各个进程的内存使用率。Oracle9i现在有一个共享的内存区域,叫做pga_aggregate_target。在使用Oracle的多线程服务器时, pga_aggregate_target参数的工作方法和Oracle的大内存池相类似,只有一个显著的不同点。有了一个共享内存区域,Oracle的各个进程,在进行排序和散裂合并时,就可以不受限制地使用多达内存池总量5%的内存。这相对于Oracle8i来说是个重大的改进,它原来要求每个PGA区域的大小必须限制在sort_area_size初始化参数所设定的值里。
Oracle9i还提供了一个叫做v$pgastat的新字典查看表。v$pgastat查看表能显示数据库内每个内存区域内的内存使用率的总量。这些信息可以告诉你内存使用率的峰值,还能允许你根据对系统的相对压力来调整内存需求。以下是一个简单的对v$pgastat的查询:
column name format a40 column value format 999,999,999 select name,value from v$pgastat order by value desc; |
你可以看到pga_aggregate_target的值以及这个实例所使用的所有内存区域的峰值。现在我们再来看看最佳、单周期和多周期的内存运行情况。
当Oracle的进程需要进行操作时,例如排序或者散裂合并,它就到pga_aggregate_target区域里的共享内存区里,尝试取得足够多的相互毗邻的内存帧来执行操作。如果这个进程能够立即取得这些内存帧,它就被标记为最优内存访问。如果需要在单周期内通过pga_aggregate_target取得所需的内存,那么内存分配就被标记为单周期。如果所有的内存都在使用中,那么Oracle也许就不得不通过pga_aggregate_target在多周期内取得内存,这叫做多周期。
记住:内存的速度是非常非常快的,绝大多数排序或者散裂合并都是在几微秒内完成的。Oracle允许单个进程最多使用pga_aggregate_target 5%的内存,并行操作最多可以被允许消耗PGA内存池30%的内存。
多周期运行显示了内存的不足,所以你总应该分配足够的内存以保证至少有95%连接上了的任务能够最佳地获得内存。
你可以查询这里列出的v$sysstat查看表来取得workarea运行的信息:
col c1 heading 'Workarea|Profile' format a35 col c2 heading 'Count' format 999,999,999 col c3 heading 'Percentage' format 99 select name c1,cnt c2,decode(total, 0, 0, round(cnt*100/total)) c3 from ( select name,value cnt,(sum(value) over ()) total from v$sysstat where name like 'workarea exec%' ); |
至少有95%的任务应该有最佳workarea运行情况。在以上的输出中,你可以看到所有的workarea运行情况,它们能运行在最佳、单周期和多周期模式下。
这里提供了和pga_aggregate_target区域大小相关的重要信息。它还能指示出内存区域的过量分配。如果最佳workarea运行的百分比持续保持在98到100%,你就可以从pga_aggregate_target里心安理得地“盗取”内存帧,并把它们分配到Oracle SGA(例如db_cache_size)的其他区域里,那里可能更需要内存资源。
查看各个workareas
Oracle还提供了数据字典查看表,它能显示SQL声明的运行计划里各个步骤所使用的内存大小。其价值对正确设置hash_area_size和其他内存密集参数的内存大小是不可估量的。
v$sql_workarea_active查看表显示了Oracle9i数据库里各个workarea的内存使用数量。
而且,Oracle提供了多个用来合并表格的方法,每个都需要不同数量的内存。Oracle9i SQL优化器能够分辨分类归并联合、嵌套循环合并、、散裂合并和星型合并方法。在有些情况下,散裂合并比分类归并联合运行得更快,但是散裂合并需要更多的内存资源和对hash_area_size参数更高级的设置。
以下是对v$sql_workarea_active查询表的查询:
Select to_number(decode(SID, 65535, NULL, SID)) sid, operation_type OPERATION, trunc(WORK_AREA_SIZE/1024) WSIZE, trunc(EXPECTED_SIZE/1024) ESIZE, trunc(ACTUAL_MEM_USED/1024) MEM, trunc(MAX_MEM_USED/1024) "MAX MEM", number_passes PASS from v$sql_workarea_active order by 1,2; |
你可以看到SQL运行每一步的内存使用数量。一个SQL声明执行Group By排序需要73 KB内存。你还可以看到运行散裂合并的两个SQL声明的系统ID(SID)。这些散裂合并分别使用了3到13 MB内存来建立内存中的散裂表。
一个非常重要的工具
Oracle 正在成为最灵活、最复杂的数据库管理系统之一。数据库组件的内存使用查看表是管理你 Oracle 数据库非常重要的工具。有了它, Oracle 专家能够更加容易地保证内存使用率的所有设置对所有应用程序都是最优的。