PGA和UGA内存的使用情况
分类:
IT文章
•
2022-07-30 20:34:09
引用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中不同排序大小,得到PGAUGA、物理读取的情况。
reset_stat脚本:记录PGAUGA、物理读取使用情况和与之前相比差值
create table sess_stats
( name varchar2(64), value number, diff number );
variable sid number
exec :sid := &1
reset_stat
watch_stat脚本:统计PGAUGA、物理读取使用情况,并写入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
###
###########################################################
#会话1:
glltabspace@GULL> @run_query 65536
已连接。
glltabspace@GULL> column sid new_val SID
glltabspace@GULL> select sid from v$mystat where rownum = 1;
SID
----------
1
glltabspace@GULL> alter session set workarea_size_policy=manual;
会话已更改。
glltabspace@GULL> alter session set sort_area_size = &1;
原值 1: alter session set sort_area_size = &1
新值 1: alter session set sort_area_size = 65536
会话已更改。
glltabspace@GULL> prompt run @reset_stat &SID and @watch_stat in another session here!
run @reset_stat 1 and @watch_stat in another session here!
glltabspace@GULL> pause
#新建一个会话,为会话2,在表还未排序时,查看初始的PGAUGA
#@reset_stat 1 ,1是会话1中的SID
glltabspace@GULL> @reset_stat 1
表已创建。
PL/SQL 过程已成功完成。
glltabspace@GULL> @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:按回车,继续执行表的排序
glltabspace@GULL> set termout off
glltabspace@GULL> prompt run @watch_stat in another session here!
run @watch_stat in another session here!
glltabspace@GULL> pause
#会话2:
glltabspace@GULL> @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