从AIX 角度,我们可以在下面三个角度衡量内存使用的合理性
1>减少页面交换操作
当操作系统需要更多内存页以支持其他应用运行时,操作系统将依据某种算法(LRU算法)把当前驻留在内存中的某些
数据页"Page Out",也就是把内存中的数据页从内存段转移到物理磁盘。显然,这种类型的操作会影响整个系统的运行性能。
对于数据库这种内存敏感类型的应用系统来说,这点尤为重要。因为数据库需要把数据放在内存中操作,这部分内存区域
称为“数据高速缓存”。
因此,一般在系统设计时,我们往往将数据库安装在一台服务器上,独占这台服务器的所有资源,避免页交换的产生。
在数据库配置时,也避免过度地将内存结构分配给数据库,人为造成操作系统空余内存的紧张。
2>SGA应宿主在物理内存中
分配SGA的目的就是为了快速地将数据存储在内存中,因为内存速率和硬盘速率相比,差别至少在4个数量级以上。如果
SGA对应的虚拟内存页被交换到换页空间(磁盘)上,那么SGA也就没有意义了。
我们可以通过 show sga命令查看系统全局区当前的分配情况:
SQL>show sga
Total System Global Area 285212672 bytes
Fixed Size 1218992 bytes
Variable Size 75499088 bytes
Database Buffers 205520896 bytes
Redo Buffers 2973696 bytes
从上面的结果可以看出,本Oracle 实例SGA总体为 285212672bytes(285MB),其中,Oracle启动固定内存1218992bytes(1.2MB)
,可变内存75499088bytes(75M),数据缓存205520896bytes(205M),日志缓存2973696bytes(2.9MB)
为用户连接准备充分的内存资源
SGA将占据数据库服务器中庞大的内存资源。除此之外,我们还需要为在系统上运行的服务器进程(Server Process,也就是
PGA)以及其他任务留下足够的内存。
Oracle启动后,其内存分配理论上依赖于应用的使用特征。如果由于内存的分配导致了I/O操作的减少,并因此优化了应用
的I/O性能,则我们认为内存使用恰当。
||||||||||||||||||
程序全局区(PGA)是包含客户端连接服务器所派生的服务器进程的集合,每个服务器进程都拥有存放数据和控制信息的私有内存
区域。客户端进程和服务器端进程一一对应,由服务器端进程完成用户的请求,并将数据返回给客户端进程。
例如,当一个用户连接数据库并调用SQL语句时,这条SQL语句对应的游标就将在PGA中创建一个运行时区域,注意,这个区域
是私有的,只针对调用SQL的这个用户进程。PGA就是所有服务器进程的逻辑集合。
因此PGA和SGA有着质的不同。SGA用于在进程间共享信息,PGA则用于信息私有化。图15-17表示了SGA和PGA内存区域内容的不同。
SGA:数据缓存、共享池、大池、Java池...
PGA:堆栈空间、用户会话数据、游标状态...
PGA的大小直接影响了性能,尤其针对会导致排序的SQL查询。以下几种情况需要提供足够的PGA:
导致排序的操作如 ORDER BY、GROUP BY、 ROLLUP等操作
哈希连接
位图合并
位图创建
批量数据装载
在Oracle 10g/11g版本中,PGA的管理被自动化设置,成为自动的PGA内存管理。在该方式中,Oracle将动态调整PGA内存的大小为
SGA内存的20%,最小值是10MB。初始化参数PGA_AGGREGATE_TARGET显示了当前PGA的分配情况。
SQL> show parameters pga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 90M
SQL>
在构建一个新的数据库实例时,PGA_AGGREGATE_TARGET 参数可以首先凭经验进行确定,例如,对应SGA大小20%。然后,
在系统载荷上升的情况下,使用Oracle PGA优化工具,调节 PGA_AGGREAGATE_TARGET参数。Oracle 提供了两个PGA建议
性能视图:V$PGA_TARGET_ADVICE和V$PGA_TARGET_ADVICE_HISTOGRAM。
例如下面的查询列出了在不同PGA设置时预计的命中率:
select round(pga_target_for_estimate/1024/1024) est_target_mb,estd_pga_cache_hit_percentage,estd_overalloc_count,pga_target_factor from v$pga_target_advice order by 1;
EST_TARGET_MB ESTD_PGA_CACHE_HIT_PERCENTAGE ESTD_OVERALLOC_COUNT
------------- ----------------------------- --------------------
PGA_TARGET_FACTOR
-----------------
11 97 2
.125
23 97 2
.25
45 100 1
.5
EST_TARGET_MB ESTD_PGA_CACHE_HIT_PERCENTAGE ESTD_OVERALLOC_COUNT
------------- ----------------------------- --------------------
PGA_TARGET_FACTOR
-----------------
68 100 0
.75
90 100 0
1
108 100 0
1.2
EST_TARGET_MB ESTD_PGA_CACHE_HIT_PERCENTAGE ESTD_OVERALLOC_COUNT
------------- ----------------------------- --------------------
PGA_TARGET_FACTOR
-----------------
126 100 0
1.4
144 100 0
1.6
162 100 0
1.8
EST_TARGET_MB ESTD_PGA_CACHE_HIT_PERCENTAGE ESTD_OVERALLOC_COUNT
------------- ----------------------------- --------------------
PGA_TARGET_FACTOR
-----------------
180 100 0
2
270 100 0
3
360 100 0
4
EST_TARGET_MB ESTD_PGA_CACHE_HIT_PERCENTAGE ESTD_OVERALLOC_COUNT
------------- ----------------------------- --------------------
PGA_TARGET_FACTOR
-----------------
540 100 0
6
720 100 0
8
14 rows selected.
SQL>