oracle数据库:内存结构_笔记3
4.1.1手动PGA内存管理
如果采用手动PGA内存管理,有些参数对PGA大小的影响最大,这是指PGA中除了会话为PL/SQL表和其他变量分配的内存以外的部分,这些参数如下所示:
.SORT_AREA_SIZE:在信息换出到磁盘之前,用于对信息排序的RAM总量。
.SORT_AREA_RETAINED_SIZE:排序完成后用于保存已排序数据的内存总量。也就是说,如果SORT_AREA_SIZE是512KB,SORT_AREA_RETAINED_SIZE是256KB,那么服务器进程最初处理查询时会用512KB的内存对数据排序。等到排序完成时,排序区会“收缩”为256KB,这256KB内存中放不下的已排序数据会写出到临时表空间中。
.HASH_AREA_SIZE:服务器进程在内存中存储散列表所用的内存量。散列联结时会使用这些散列表结构,通常把一个大集合与另一个集合联结时就会用到这些结构。两个集合中较小的一个会散列到内存中,散列区中放不下的部分都会通过联结键存储在临时表空间中。
Oracle将数据写至磁盘(或换出到磁盘)之前,数据排序或散列所用的空间量就由这些参数控制,这些参数还控制着排序完成后会保留多少内存段。通过查询一些特殊的Oracle V$视图,可以看到PGA和UGA内存的当前使用情况,并监视其大小的变化,这些特殊的V$视图也称为动态性能视图(dynamic performance view)。
run_query.sql
connect sys/bar as sysdba
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
reset_stat.sql
drop table sess_stats;
create table sess_stats(name varchar2(64),value number,diff number);
variable sid number
exec :sid :=&1
watch_stat.sql
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;
会话一
sys@ORCL>@run_query 65536
Connected.
sys@ORCL>column sid new_val SID
sys@ORCL>select sid from v$mystat where rownum = 1;
SID
----------
58
sys@ORCL>alter session set workarea_size_policy=manual;
Session altered.
sys@ORCL>alter session set sort_area_size = &1;
old 1: alter session set sort_area_size = &1
new 1: alter session set sort_area_size = 65536
Session altered.
sys@ORCL>prompt run @reset_stat &SID and @watch_stat in another session here!
run @reset_stat 58 and @watch_stat in another session here!
sys@ORCL>pause
sys@ORCL>set termout off
sys@ORCL>prompt run @watch_stat in another session here!
run @watch_stat in another session here!
sys@ORCL>pause
会话二
sys@ORCL>@reset_stat 58
Table dropped.
Table created.
PL/SQL procedure successfully completed.
sys@ORCL>@watch_stat
6 rows merged.
NAME
-----------------------------------------------------------------------------------------------
-----
KBYTES_WRITES DIFF_KBYTES_WRITES
------------- ------------------
physical reads direct temporary tablespace
0 0
physical writes direct temporary tablespace
0 0
session pga memory
673
session pga memory max
673
session uga memory
242
session uga memory max
242
6 rows selected.
sys@ORCL>@watch_stat
6 rows merged.
NAME
-----------------------------------------------------------------------------------------------
-----
KBYTES_WRITES DIFF_KBYTES_WRITES
------------- ------------------
physical reads direct temporary tablespace
3211 3211
physical writes direct temporary tablespace
3211 3211
session pga memory
801 128
session pga memory max
1249 576
session uga memory
370 128
session uga memory max
434 192
6 rows selected.
会话三
@run_query 1048576
会话四
sys@ORCL>@reset_stat 58
Table dropped.
Table created.
PL/SQL procedure successfully completed.
sys@ORCL>@watch_stat
6 rows merged.
NAME
-----------------------------------------------------------------------------------------------
-----
KBYTES_WRITES DIFF_KBYTES_WRITES
------------- ------------------
physical reads direct temporary tablespace
0 0
physical writes direct temporary tablespace
0 0
session pga memory
673
session pga memory max
673
session uga memory
242
session uga memory max
242
6 rows selected.
sys@ORCL>@watch_stat
6 rows merged.
NAME
-----------------------------------------------------------------------------------------------
-----
KBYTES_WRITES DIFF_KBYTES_WRITES
------------- ------------------
physical reads direct temporary tablespace
1071 1071
physical writes direct temporary tablespace
1071 1071
session pga memory
673 0
session pga memory max
2209 1536
session uga memory
242 0
session uga memory max
1344 1102
6 rows selected.
会话五
@run_query 1073741820
会话六
sys@ORCL>@reset_stat 59
Table dropped.
Table created.
PL/SQL procedure successfully completed.
sys@ORCL>@watch_stat
6 rows merged.
NAME
-----------------------------------------------------------------------------------------------
-----
KBYTES_WRITES DIFF_KBYTES_WRITES
------------- ------------------
physical reads direct temporary tablespace
0 0
physical writes direct temporary tablespace
0 0
session pga memory
673
session pga memory max
673
session uga memory
242
session uga memory max
242
6 rows selected.
sys@ORCL>@watch_stat
6 rows merged.
NAME
-----------------------------------------------------------------------------------------------
-----
KBYTES_WRITES DIFF_KBYTES_WRITES
------------- ------------------
physical reads direct temporary tablespace
0 0
physical writes direct temporary tablespace
0 0
session pga memory
673 0
session pga memory max
11169 10496
session uga memory
242 0
session uga memory max
10602 10361
6 rows selected.
在使用*_AREA_SIZE参数时,需要记住以下重要的几点。
.这些参数控制着SORT、HASH或BITMAP MERGE操作所用的最大内存量
???.一个查询可能有多个操作,这些操作可能都要使用这个内存,这样会创建多个排序/散列区。要记住,可以同时打开多个游标,每个游标都有自己的SORT_AREA_RETAINED需求。所以,如果把排序区大小设置为10MB,在会话中实际上可以使用10MB、100MB、1000MB或更多RAM。这些设置并非对会话的限制,它们只是对一个操作的限制。你的会话中,一个查询可以有多个排序,或者多个查询需要一个排序。
.这些内存区都是根据需要来分配的。如果像我们一样,将排序区大小设置为1GB,这并不是说你要分配1GB的RAM,而只是说,你允许Oracle进程为一个排序/散列操作最多分配1GB的内存。
http://www.52ij.com/jishu/5163.htmloracle数据库:内存结构_笔记2
本文来源 我爱IT技术网 http://www.52ij.com/jishu/5164.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
