也许这是正常的,但在我的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中打开表的任何时候资源使用率都会上升,但即使关闭它,内存也不会消失。如果表在打开时进行排序,问题就更糟了,因为它似乎使用了更多的内存。我理解它在排序时会如何使用内存,甚至可能在它仍处于打开状态时使用内存,但是在内存关闭后使用内存似乎对我不利。谁能证实这一点?
更新: 我发现由于不理解the UGA is stored in the PGA under dedicated server mode,我的号码已关闭。这使得数字低于它们,但问题仍然是SQL Developer似乎使用了过多的PGA。
答案 0 :(得分:3)
也许SQL Developer不会关闭它打开的游标。 因此,如果您运行一个对100万行进行排序的查询,而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
这应该表明一些游标是否仍然保持打开状态......
答案 1 :(得分: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位。
答案 2 :(得分:0)
Oracle,尤其是AMM,将使用您提供的机器上的每一块内存。如果它没有理由去除内存,它就不会这样做。存储空间也是如此:如果删除20 GB的用户数据,则不会将空间返回给操作系统。除非您明确压缩表空间,否则Oracle将坚持使用它。
我相信一个简单的测试可以减轻您的顾虑。如果它是32位,并且每个SQL Developer会话使用100MB + RAM,那么你只需要打开几百个会话就会导致内存不足......如果真的有问题。