oracle数据库:内存结构_笔记5
2.使用PGA_AGGREGATE_TARGET控制内存分配
“理论上”可以使用PGA_AGGREGATE_TARGET来控制实例使用的PGA内存的总量。这并不是一个硬性限制。实例会尽力保持在PGA_AGGREGATE_TARGET限制以内,但是如果实在无法保证,它也不会停止处理,只是要求超过这个阈值。
这个限制只是一个“理论上”的限制,对此还有一个原因:尽管工作区在PGA内存中所占的比重很大,但PGA内存中并非只有工作区。PGA内存分配涉及很多方面,其中只有工作区在数据库实例的控制之下。???如果创建并执行一个PL/SQL代码块将数据填入一个很大的数组,这里采用专用服务器模式,因此UGA在PGA中,倘若是这样,Oracle只能任由你这样做,而无法干涉。
例子
我们创建一个包,其中可以保存服务器中的一些持久(全局)数据:
idle>create or replace package demo_pkg
2 as
3 type array is table of char(2000) index by binary_integer;
4 g_data array;
5 end;
6 /
Package created.
下面,测量这个会话当前使用的PGA/UGA内存量
idle>select a.name,to_char(b.value,'999,999,999') bytes,
2 to_char(round(b.value/1024/1024,1),'99,999.9') mbytes
3 from v$statname a,v$mystat b
4 where a.statistic#=b.statistic#
5 and a.name like '%ga memory%';
NAME
-----------------------------------------------------------------------------------------------
-----
BYTES MBYTES
------------------------------------ ---------------------------
session uga memory
2,060,808 2.0
session uga memory max
3,293,344 3.1
session pga memory
3,245,024 3.1
session pga memory max
5,014,496 4.8
最初会话中使用了大约4.8MB的PGA内存(因为还要编译PL/SQL包,运行这个查询,等等)。现在,再对BIG_TABLE运行空虚查询,这里的PGA_AGGREGATE_TARGET同样是256MB
idle>set autotrace traceonly statistics;
idle>select * from t order by 1,2,3,4;
72815 rows selected.
Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
1039 consistent gets
1037 physical reads
0 redo size
5505630 bytes sent via SQL*Net to client
53918 bytes received via SQL*Net from client
4856 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
72815 rows processed
可以看到,排序完全在内存中完成,实际上,如果看一下这个会话的PGA/UGA使用情况,就能看出我们用了多少PGA/UGA内存:
idle>select a.name,to_char(b.value,'999,999,999') bytes,
2 to_char(round(b.value/1024/1024,1),'99,999.9') mbytes
3 from v$statname a,v$mystat b
4 where a.statistic# =b.statistic#
5 and a.name like '%ga memory%';
NAME
-----------------------------------------------------------------------------------------------
-----
BYTES MBYTES
------------------------------------ ---------------------------
session uga memory
2,453,688 2.3
session uga memory max
11,519,952 11.0
session pga memory
3,441,632 3.3
session pga memory max
12,551,136 12.0
观察到为12MB的RAM。现在,再填入包中的CHAR数组(CHAR数据类型用空格填充,这样每个数组元素的长度都正好是2000个字符):
idle>begin
2 for i in 1 .. 200000
3 loop
4 demo_pkg.g_data(i) :='x';
5 end loop;
6 end;
7 /
PL/SQL procedure successfully completed.
现在,测量会话当前使用的PGA,可以看到下面的结果:
idle>select a.name,to_char(b.value,'999,999,999') bytes,
2 to_char(round(b.value/1024/1024,1),'99,999.9') mbytes
3 from v$statname a,v$mystat b
4 where a.statistic# =b.statistic#
5 and a.name like '%ga memory%'
6 ;
NAME
-----------------------------------------------------------------------------------------------
-----
BYTES MBYTES
------------------------------------ ---------------------------
session uga memory
470,103,432 448.3
session uga memory max
470,103,432 448.3
session pga memory
471,630,816 449.8
session pga memory max
471,630,816 449.8
现在,数据库本身无法控制PGA中分配的这些内存。不过,数据库很清楚我们做了什么。尽管有些内存无法控制,但它不会忽略这部分内存;而是会识别已经使用的内存,并相应地减少为工作区分配的内存大小。所以,如果再运行同样的排序查询,可以看到,这一次会在磁盘上排序。
idle>set autotrace traceonly statistics;
idle>select * from t order by 1,2,3,4;
72815 rows selected.
Statistics
----------------------------------------------------------
9 recursive calls
8 db block gets
1039 consistent gets
2105 physical reads
0 redo size
5505630 bytes sent via SQL*Net to client
53918 bytes received via SQL*Net from client
4856 SQL*Net roundtrips to/from client
0 sorts (memory)
1 sorts (disk)
72815 rows processed
http://www.52ij.com/jishu/5165.htmloracle数据库:内存结构_笔记4
本文来源 我爱IT技术网 http://www.52ij.com/jishu/5166.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
