PGA和UGA内存的使用情况

引用thomas kyte的PGA和UGA的统计内存的使用情况,用排序区不同的大小来查看pga、UGA、物理读取不同内存使用

会话1:创建测试表和测试不同排序大小

create table t as select * from all_objects;
exec dbms_stats.gather_table_stats( user, ‘T‘ );

创建测试表

创建run_query脚本:用于控制内存参数排序区(sort_area_size)的大小和表的排序

connect glltabspace/oracle
set serveroutput off
set echo on
column sid new_val SID
select sid from v$mystat where rownum = 1;
alter session set workarea_size_policy=manual;
alter session set sort_area_size = &1;
prompt run @reset_stat &SID and @watch_stat in another session here!
pause
set termout off
select * from t order by 1, 2, 3, 4;
set termout on
prompt run @watch_stat in another session here!
pause

run_query

会话2:查看会话1中不同排序大小,得到PGA\UGA、物理读取的情况。

reset_stat脚本:记录PGA\UGA、物理读取使用情况和与之前相比差值

create table sess_stats
( name varchar2(64), value number, diff number );

variable sid number
exec :sid := &1

reset_stat

watch_stat脚本:统计PGA\UGA、物理读取使用情况,并写入reset_stat脚本创建的表

merge into sess_stats
using
(
select a.name, b.value
  from v$statname a, v$sesstat b
 where a.statistic# = b.statistic#
   and b.sid = :sid
   and (a.name like ‘%ga %‘
        or a.name like ‘%direct temp%‘)
) curr_stats
on (sess_stats.name = curr_stats.name)
when matched then
  update set diff = curr_stats.value - sess_stats.value,
             value = curr_stats.value
when not matched then
  insert ( name, value, diff )
  values
  ( curr_stats.name, curr_stats.value, null )
/

select name,
       case when name like ‘%ga %‘
            then round(value/1024,0)
            else value
        end kbytes_writes,
       case when name like ‘%ga %‘
            then round(diff /1024,0)
            else value
        end diff_kbytes_writes
  from sess_stats
 order by name;

watch_stat

设置排序区为64KB(65536),查看PGA,UGA

###########################################################
###     

设置排序区为64KB(65536),查看PGA,UGA

         ###
###########################################################
#会话1:
[email protected]>  @run_query 65536
已连接。
[email protected]> column sid new_val SID
[email protected]> select sid from v$mystat where rownum = 1;

       SID
----------
         1

[email protected]> alter session set workarea_size_policy=manual;

会话已更改。

[email protected]> alter session set sort_area_size = &1;
原值    1: alter session set sort_area_size = &1
新值    1: alter session set sort_area_size = 65536

会话已更改。

[email protected]> prompt run @reset_stat &SID and @watch_stat in another session here!
run @reset_stat          1 and @watch_stat in another session here!
[email protected]> pause

#新建一个会话,为会话2,在表还未排序时,查看初始的PGA\UGA
#@reset_stat 1 ,1是会话1中的SID
[email protected]> @reset_stat 1

表已创建。

PL/SQL 过程已成功完成。

[email protected]> @watch_stat

6 行已合并。

NAME                                                             KBYTES_WRITES DIFF_KBYTES_WRITES
---------------------------------------------------------------- ------------- ------------------
physical reads direct temporary tablespace                                   0                  0
physical writes direct temporary tablespace                                  0                  0
session pga memory                                                        1185
session pga memory max                                                    1185
session uga memory                                                         370
session uga memory max                                                     434

已选择6行。

#此时说明:现在的会话使用uga=370kb,最大值434kb,PGA=1185KB,最大值1185kb

#会话1:按回车,继续执行表的排序

[email protected]> set termout off
[email protected]> prompt run @watch_stat in another session here!
run @watch_stat in another session here!
[email protected]> pause

#会话2:

[email protected]> @watch_stat

6 行已合并。

NAME                                                             KBYTES_WRITES DIFF_KBYTES_WRITES
---------------------------------------------------------------- ------------- ------------------
physical reads direct temporary tablespace                                3181               3181
physical writes direct temporary tablespace                               3181               3181
session pga memory                                                         993               -192
session pga memory max                                                    1249                 64
session uga memory                                                         498                128
session uga memory max                                                     562                128

已选择6行。
#说明:临时表空间的读取、写入比较大
pga:993KB,最大值1249kb
uga:498kb,最大值562kb

排序区为64kb

设置排序区为1MB(1048576)查看PGA,UGA

NAME                                                             KBYTES_WRITES DIFF_KBYTES_WRITES
---------------------------------------------------------------- ------------- ------------------
physical reads direct temporary tablespace                                1064               1064
physical writes direct temporary tablespace                               1064               1064
session pga memory                                                         801                  0
session pga memory max                                                    2209                  0
session uga memory                                                         370                  0
session uga memory max                                                    1344                  0

已选择6行。

排序区1MB

发现此时的临时表空间的I/O次数有所下降

设置排序区为1G(1073741820)查看PGA,UGA

NAME                                                             KBYTES_WRITES DIFF_KBYTES_WRITES
---------------------------------------------------------------- ------------- ------------------
physical reads direct temporary tablespace                                   0                  0
physical writes direct temporary tablespace                                  0                  0
session pga memory                                                         737                  0
session pga memory max                                                   10849              10112
session uga memory                                                         306                  0
session uga memory max                                                   10282               9977

排序区1G

当排序区为1g,实际的uga的大小使用10mb,此时的临时表空间I/O数为0,说明排序区的内存不是一开始就分配,需要多少分配多少,但不会超过sort_area_size的大小

时间: 2024-12-06 00:23:55

PGA和UGA内存的使用情况的相关文章

Android最佳性能实践(二)——分析内存的使用情况

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/42238633 虽说现在的手机内存都已经非常大了,但是我们大家都知道,系统是不可能将所有的内存都分配给我们的应用程序的.没错,每个程序都会有可使用的内存上限,这被称为堆大小(Heap Size).不同的手机,堆大小也不尽相同,随着现在硬件设备不断提高,堆大小也已经由Nexus One时的32MB,变成了Nexus 5时的192MB.如果大家想要知道自己手机的堆大小是多少,可以调用如

Android 中查看内存的使用情况集常用adb命令

1. 在IDE中查看Log信息 当程序运行垃圾回收的时候,会打印一条Log信息,其格式如下: D/dalvikvm: <GC_Reason> <Amount_freed>, <Heap_stats>, <External_memory_stats>, <Pause_time> GC_Reason表示导致垃圾回收的原因以及当前的回收类型,包括以下几类: GC_CONCURRENT:当堆中对象数量达到一定是触发的垃圾收集 GC_FOR_MALLOC:

配置myeclipse虚拟机内存,避免项目初始化完成不了或者老提示虚拟机内存不够的情况

对于很大的项目,往往会占用很大的内存,这时,myeclipse可能会提示你,java虚拟机内存不够的情况: 于是,需要进行如下一些配置: 1,配置myeclipse.ini文件: 2,配置myeclipse中的tomcat下的jdk,如下图所示: 3,配置jdk的Java VM参数,如下图所示: 本来myeclipse就特别占内存,最好就是加大电脑的内存.

Linux中查看进程占用内存和系统资源情况的命令

用 'top -i' 看看有多少进程处于 Running 状态,可能系统存在内存或 I/O 瓶颈,用 free 看看系统内存使用情况,swap 是否被占用很多,用 iostat 看看 I/O 负载情况... 还有一种办法是 ps -ef | sort -k7 ,将进程按运行时间排序,看哪个进程消耗的cpu时间最多. top: 主要参数 d:指定更新的间隔,以秒计算. q:没有任何延迟的更新.如果使用者有超级用户,则top命令将会以最高的优先序执行. c:显示进程完整的路径与名称. S:累积模式,

&quot;每日一道面试题&quot;.net托管堆是否会存在内存泄漏的情况

首先说答案:会 所谓的内存泄漏,就是指内存空间上产生了不再被实际使用却又无非被分配的对象.严格意义上来说,在.net中经常会遇到内存泄漏的情况,因为托管堆内的对象不再被使用时,需要等待下一次GC才会被释放.大对象的分配与释放,不正确的Finalize方法,以及不恰当的保存根引用都会引发内存泄漏的情况. 在GC进行垃圾回收的时候,有两个基本动作,第一个就是遍历找到不再被使用的对象,并标记为垃圾,第二个就是移动对象是他们紧靠托管堆的一方.在.net中,大对象被分配到托管堆上一个特殊的区域,称为“大对

Android 中查看内存的使用情况集经常使用adb命令

1. 在IDE中查看Log信息 当程序执行垃圾回收的时候,会打印一条Log信息.其格式例如以下: D/dalvikvm: <GC_Reason> <Amount_freed>, <Heap_stats>, <External_memory_stats>, <Pause_time> GC_Reason表示导致垃圾回收的原因以及当前的回收类型,包含下面几类: GC_CONCURRENT:当堆中对象数量达到一定是触发的垃圾收集 GC_FOR_MALLO

WPF的TextBox产生内存泄露的情况

前段时间参与了一个WPF编写的项目,在该项目中有这样一个场景:在程序运行过程中需要动态地产生大量文本信息,并追加WPF界面上的一个TextBox的Text中进行显示.编写完之后,运行该项目的程序,发现在产生大量信息之后,发现系统变慢了,打开任务管理器才发现,该项目的程序占用了将近1.5G的内存(天啊!!!这不是一般的耗内存啊!!!).后来通过查资料和探索才发现了WPF的TextBox在追加Text显示文本时会造成内存泄露.下面通过一个小Demo程序来展示一下这个内存泄露. 我的Demo程序很简单

c和C++在编译是内存的分配情况

在静态存储区:内存的分配在程序执行前就分配好了,在程序运行的过程中一直 存在,如全局变量,和static声明的变量.  在栈中:内存的分配是在程序的运行过程中被分配,函数结束后系统自动释放.  在堆中:即动态分配,一般用malloc和new分配内存的大小,程序员自己用free和delete自己释 放,  因此程序员可以自己控制其生命周期,一定要注意在用完后手动释放,如果不释放就会  造成内存的泄漏.  一个C和C++程序编译时分为5大存储区:堆区,栈区,全局区,文字常量区,程序代码区. c和C+

nodejs查看内存的使用情况

nodejs查看内存的使用情况 by 伍雪颖 var showMem = function() { var mem = process.memoryUsage(); var format = function(bytes) { return (bytes/1024/1024).toFixed(2)+'MB'; }; console.log('Process: heapTotal '+format(mem.heapTotal) + ' heapUsed ' + format(mem.heapUse