5

也许这很正常,但在我的 Oracle 11g 数据库中,我看到使用 Oracle 的 SQL Developer 的程序员经常消耗超过 100MB 的 UGA 和 PGA 内存组合。我想知道这是否正常以及可以做些什么。我们的数据库在 32 位版本的 Windows 2008 上,因此内存限制越来越受到关注。我正在使用以下查询来显示内存使用情况:

SELECT e.SID, e.username, e.status, b.PGA_MEMORY
FROM v$session e
LEFT JOIN 
   (select y.SID, y.value pga, 
      TO_CHAR(ROUND(y.value/1024/1024),99999999) || ' MB' PGA_MEMORY 
   from v$sesstat y, v$statname z 
   where y.STATISTIC# = z.STATISTIC# and NAME = 'session pga memory') b
ON e.sid=b.sid
WHERE (PGA)/1024/1024 > 20
ORDER BY 4 DESC;

似乎每次在 SQLDeveloper 中打开表时,资源使用率都会上升,但即使它关闭,内存也不会消失。如果表在打开时进行排序,问题会更严重,因为这似乎会使用更多内存。我知道这将如何在排序时使用内存,甚至在它仍然打开的时候,但是在它关闭后使用内存对我来说似乎是错误的。谁能证实这一点?

更新:我发现我的号码是关闭的,因为不了解UGA 在专用服务器模式下存储在 PGA 中。这使得数字低于原来的水平,但问题仍然存在,SQL Developer 似乎使用了过多的 PGA。

4

3 回答 3

3

也许 SQL Developer 没有关闭它打开的游标。因此,如果您运行一个对一百万行进行排序的查询,而 SQL Developer 只从那里获取前 20 行,那么如果您想向下滚动并获取更多信息,它需要保持游标打开。

因此,只要游标处于打开状态且尚未达到 EOF(取指结束),它就需要保留一些与游标的排序区域相关联的 PGA 内存(称为保留排序区域)。

选择一个会话并运行:

select sql_id,operation_type,actual_mem_used,max_mem_used,tempseg_size
from v$sql_workarea_active
where sid = &SID_OF_INTEREST

这应该显示一些游标是否仍然保持打开状态......

于 2010-09-09T11:58:16.037 回答
0

你在使用自动内存管理吗?如果是,我不会担心使用的 PGA 内存。

请参阅文档:

自动内存管理:http: //download.oracle.com/docs/cd/B28359_01/server.111/b28310/memory003.htm#ADMIN11011

MEMORY_TARGET:http: //download.oracle.com/docs/cd/B28359_01/server.111/b28320/initparams133.htm

您使用 32 位 Oracle 是否有原因?最新的硬件支持 64 位。

于 2009-09-10T01:21:48.990 回答
0

Oracle,尤其是 AMM,将使用您提供给它的机器上的每一点内存。如果它没有理由取消分配内存,它就不会这样做。存储空间也是如此:如果您删除 20 GB 的用户数据,该空间不会返回给操作系统。除非您明确压缩表空间,否则 Oracle 将保留它。

我相信一个简单的测试应该可以消除您的担忧。如果它是 32 位的,并且每个 SQL Developer 会话使用 100MB 以上的 RAM,那么您只需要打开几百个会话就可以导致内存不足的问题……如果真的有的话。

于 2010-04-08T15:43:54.833 回答