之前我们介绍了:Oracle 10g内存结构之共享池的相关知识及使用简介,本文我们接着介绍一下剩余的部分,包括:程序全局区、排序区、Java池等的相关知识,接下来我们就开始介绍这部分内容。
程序全局区
程序全局区是包含单个用户或服务器数据和控制信息的内存区域。程序全局区是用户进程连接到oracle数据库并创建一个会话时,由oracle自动分配的。与sga不同,pga 并非共享区,主要用于用户在编程时存储变量和数组。该区域中 STACK SPACE 是用于存储用户会话的变量和数组的存储区域,USER SESSION DATA 是用户会话使用的附加区域。用户会话结束pga 释放。
排序区
Sort Area 是为有排序请求的sal 语句提供内存空间,系统使用专用的内存区域进行数据排序,这部分空间就称为排序区,用户数据的排序可以分为两个一个是内存排序区,另外一个是磁盘临时段。系统优先使用内存排序区进行排序。如果内存不够,oracle自动使用磁盘临时段表空间进行排序。
要了解排序区的大小,可以查看 sort_area_size 方法如下:
参数文件:
- ….
- Compatible = 8.1.0
- Sort_area_size = 65536
- Sort_area_retained_size = 65536
- …..
方法二:
- SQL>select name,value from v$parameter where name like ‘%size’;
方法三:
- SQL> show parameter sort_area_size
如果要了解数据库中排序区的使用情况,确认在内存排序量与磁盘排序量,可以查询数据字典v$sysstat
SQL> select name,value from v$sysstat where name like ‘%sort%’;
大池
大池(large pool)用于数据库备份工具—恢复管理器(rman)
大池的参数由large_pool_size 确定。
查询该值的方法有三,这里介绍其中一个方法:
SQL> show parameter large_pool_size
Java 池
参数java_pool_size 大小应该不小于20M。
Oracle10g自动共享内存管理
在oracle 中 将参数STSTISTICS_LEVEL 设置为 TYPICAL(默认)或ALL,使用新参数SGA_TARGET 指出SGA内存分配总大小即可,不需要定义SHAR_POOL_SIZE DB_CACHE_SIZE 等参数,数据库服务器会自动根据需要动态分配。 注意如果没有sga_targe ,则自动共享内存管理功能被禁止,仍然可以设置每个参数。在设置了SGA_TARGET 后,其他参数默认设置为0。
自动恭喜内存管理时设置内存参数的最小值限制:如果数据库管理员了解某一个应用所需的内存大小,就可以为内存组件指定最小值。最小值可以用相应的参数进行设置,例如:
- SGA_TARGET= 256m
- SHARE_POOL_SIZE= 32M
- DB_CACHE_SIZE = 100M
即在自动分配时,共享池及数据缓冲区的值不得小于32m 和 100m ,其余的124m 内存将分配给其他组件。可以查询数据字典 v$sga_dynamic_components 了解各个组件的分配值。
当启动自动共享内存管理的功能后,对于自动设置的参数也可以手动设置,例如SHARE_POOL_SIZE 如果为sga 组件参数设置了比较小的值,则不会立即起作用,例如:如果设置参数SGA_TARGET = 512M ,SHARE_POOL_SIZE = 256M 而当前共享池为284M,如果dba 动态减少SHARE_POOL_SIZE的值,使之低于256M或更低的值时将不起作用。如果参数值超过当前组件值,则组件的值也随之增加,如果SHARE_POOL_SIZE的值为300M,则共享池增加到300M。
在自动管理内存时,当参数的取值增加时,则用于自动调整地额外内存就减少,反之亦然。
此外,一些sga参数必须由数据库管理员设置,系统将不进行自动调整。这些参数包括:
- LOG_BUFFER
- DB_KEEP_CACHE_SIZE
- DB_RECYCLE_CACHE_SIZE
- DB_nK_CACHE_SIZE
- STREAMS_POOL_SIZE
这些参数设置后将影响到其他参数的自动分配,(可用内存变化)。
手动内存管理转到自动内存管理
如果要从手动内存管理转到自动内存管理,只需要增加参数SGA_TARGET即可。首先,计算出SGA各个参数的取值,再加上16M(fixed SGA overhead),即可得到SGA总大小。然后从参数文件中将内存各个组件的值取消。例如:
- SHARE_POOL_SIZE = 256M
- DB_CACHE_SIZE = 512M
- LARGE_POOL_SIZE = 256M
- LOG_BUFFER = 16M
则SGA_TARGET = 256+512+256+16+16 =1056M,也可以查询数据字典得到:
- SQL> select ( ( select sum(value) from v$sga ) – (select current_size from v$ sga_dynamic_free_memory ) ) “sga_target” from dual;
又例如:如果一个手动管理的实例SGA_MAX_SIZE = 1200M 其中
- SHARE_POOL_SIZE = 200M
- DB_CACHE_SIZE = 500M
- LARGE_POOL_SIZE = 200M
查询结果如下:
- SQL> select sum(value) from v$sga ; 结果为1200m
- SQL> select current_size from v$sga_dynamic_free_memory ;
结果为208M。
则SGA_TARGET =1200 – 208 = 902M。
从参数文件取消SHARE_POOL_SIZE DB_CACHE_SIZE LARGE_POOL_SIZE
在自动内存管理方式下,如果数据库适用spfile ,那么数据库关闭后,系统激昂上一次数据库关闭时的状态记录下来,经过调整后的内存参数的各个组件的值将保存在参数文件中,所以如果使用自动内存管理,最好使用spfile。
关于Oracle 10g内存结构之排序区和Java池的相关知识就介绍到这里了,希望本次的介绍能够对您有所收获。
【编辑推荐】