代码之家  ›  专栏  ›  技术社区  ›  Leigh Riffel

sqldeveloper使用超过100MB的pga

  •  5
  • Leigh Riffel  · 技术社区  · 15 年前

    也许这是正常的,但在我的oracle 11g数据库中,我看到使用oracle的sql开发人员经常消耗超过100MB的uga和pga组合内存。我想知道这是否正常,我们能做些什么。我们的数据库是32位版本的Windows2008,因此内存限制正成为一个越来越令人担忧的问题。我使用以下查询来显示内存使用情况:

    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。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Tanel Poder    14 年前

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

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

    选择会话并运行:

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

    这将显示一些游标是否仍保持打开状态并保留其内存…

        2
  •  0
  •   Angelo Marcotullio    15 年前

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

    参见文档:

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

    内存目标: http://download.oracle.com/docs/cd/B28359_01/server.111/b28320/initparams133.htm

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

        3
  •  0
  •   No AI now No AI ever    15 年前

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

    我相信一个简单的测试可以减轻你的担忧。如果它是32位的,并且每个sql开发人员会话都使用100mb+的ram,那么您只需要打开几百个会话就可以导致内存不足问题……如果真的有这样一个问题的话。