我们使用的是 Oracle 11g 标准,没有任何选项(diag/tunning/perf)。
我可以用下面的 SQL 识别一个会话,该会话在过去几个小时内消耗大量内存(1.4 GB)......(pga 和 uga)
有什么方法可以获取有关此消费的详细信息?
不管是使用临时表还是别的什么?
with x as (select s.osuser osuser , s.username
, s.status
, se.sid
, s.serial# serial
, n.name
, round(max(se.value)/1024/1024, 2) maxmem_mb
, max(se.value) as maxmem
from v$sesstat se , v$statname n , v$session s
where n.statistic# = se.statistic#
and n.name in ('session pga memory','session pga memory max', 'session uga memory','session uga memory max')
and s.sid = se.sid
group by s.osuser, s.username, s.status, se.sid, s.serial#, n.name
order by maxmem desc
)
select * from x where rownum < 5
;
经过一些研究,我发现了视图 V$PROCESS_MEMORY_DETAIL 以及如何使用它。
默认情况下它总是空的,需要一些命令来“启用”它(oradebug 或 alter session)。
我找到的参考资料:
Oracle 文章中的这句话说明了一切:
和一个有用的 SQL:
这里有详细的信息……
只需要挖掘神秘的名字。
您可以检查执行了哪个语句以及它的作用。可行的方法是从 v$session 获取 SQL_ID 并将其与 v$sqlstats 连接。
您可以使用DBMS_XPLAN检查语句的执行计划。
有了这些信息,您就有了一些使用哪些缓冲区的提示。
另一种可能性是安装 perfstat,拍摄快照,启动会话,并在会话完成后拍摄另一个快照。perfstat 输出提供了数据库活动的详细信息。