SQLDeveloper使用超过100MB的PGA

Lei*_*fel 5 oracle memory-management oracle11g oracle-sqldeveloper

也许这是正常的,但在我的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;
Run Code Online (Sandbox Code Playgroud)

似乎在SQLDeveloper中打开表的任何时候资源使用率都会上升,但即使关闭它,内存也不会消失.如果表在打开时进行排序,问题就更糟了,因为它似乎使用了更多的内存.我理解它在排序时会如何使用内存,甚至可能在它仍处于打开状态时使用内存,但是在内存关闭后使用内存似乎对我不利.谁能证实这一点?

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

小智 3

也许 SQL Developer 没有关闭它打开的游标。因此,如果您运行一个对 1​​00 万行进行排序的查询,并且 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
Run Code Online (Sandbox Code Playgroud)

这应该显示某些游标是否仍然以其内存保持打开状态......