select value from v$pgastat where NAME='total PGA allocated'; 或者 select sum(PGA_ALLOC_MEM) from v$process;
这两个值应该相当接近。
但是,事实是这样么?这两个视图是完全准确的么? 答案是否定的。这两个视图会少计算PGA。
让实验告诉我们为什么: 1. 在一个几乎完全idle的数据库上(dedicate mode),由动态视图显示其当前PGA为76M, 当前session数目为34;操作系统当前free memory为11143.6M。 select value/1024/1024 from v$pgastat where NAME='total PGA allocated' union all select sum(PGA_ALLOC_MEM)/1024/1024 from v$process union all select count(*) from v$session; VALUE/1024/1024 --------------- 76.6796875 76.6996403 34
所以,随之而来的计算PGA的脚本也孕育而生,其实逻辑很简单: 1.找出所有process,除了后台进程(其实后台进程也应该算在PGA之内,但是由于在高并发环境下pmap -x 后台进程比较危险,而且也没多少后台进程,所以忽略不计)。 select spid from v$process where spid is not null and background is null;