系统不同的应用的具体设置情况,从而提供一个参照信息给大家。
为了得出一个参照设置,我们就必须假定一个参照环境。以下所有设置我们基于这样一
个假定,那就是硬件服务器上只考虑存在操作系统和数据库,在这个单一的环境中,我们来
考虑内存的设置。
在设置参数之前呢,我们首先要问自己几个问题
一:物理内存多大
二:操作系统估计需要使用多少内存
三:数据库是使用文件系统还是裸设备
四:有多少并发连接
五:应用是 OLTP 类型还是 OLAP 类型
根据这几个问题的答案,我们可以粗略地为系统估计一下内存设置。那我们现在来逐
个问题地讨论,首先物理内存多大是最容易回答的一个问题,然后操作系统估计使用多少内
存呢?从经验上看,不会太多,通常应该在 200M 以内(不包含大量进程 PCB)。
接下来我们要探讨一个重要的问题,那就是关于文件系统和裸设备的问题,这往往容
易被我们所忽略。操作系统对于文件系统,使用了大量的 buffer 来缓存操作系统块。这样当
数据库获取数据块的时候,虽然 SGA 中没有命中,但却实际上可能是从操作系统的文件缓
存中获取的。而假如数据库和操作系统支持异步 IO,则实际上当数据库写进程 DBWR 写磁
盘时,操作系统在文件缓存中标记该块为延迟写,等到真正地写入磁盘之后,操作系统才通
知 DBWR 写磁盘完成。对于这部分文件缓存,所需要的内存可能比较大,作为保守的估计,
我们应该考虑在 0.2——0.3 倍内存大小。但是如果我们使用的是裸设备,则不考虑这部分
缓存的问题。这样的情况下 SGA 就有调大的机会。
关于数据库有多少并发连接,这实际上关系到 PGA 的大小(MTS 下还有
large_pool_size)。事实上这个问题应该说还跟 OLTP 类型或者 OLAP 类型相关。对于 OLTP
类型 oracle 倾向于可使用 MTS,对于 OLAP 类型使用独立模式,同时 OLAP 还可能涉及到大
量的排序操作的查询,这些都影响到我们内存的使用。那么所有的问题综合起来,实际上主
要反映在 UGA 的大小上。UGA 主要包含以下部分内存设置
SQL> show parameters area_size
NAME
TYPE
VALUE
------------------------------------
-------
-------------
bitmap_merge_area_size
integer
1048576
create_bitmap_area_size
integer
8388608
hash_area_size
integer
131072
sort_area_size
integer
65536
SQL>
在这部分内存中我们最关注的通常是 sort_area_size,这是当查询需要排序的时候,数据
库会话将使用这部分内存进行排序,当内存大小不足的时候,使用临时表空间进行磁盘排序。
由于磁盘排序效率和内存排序效率相差好几个数量级,所以这个参数的设置很重要。这四个
参数都是针对会话进行设置的,是单个会话使用的内存的大小,而不是整个数据库使用的。
偶尔会看见有人误解了这个参数以为是整个数据库使用的大小,这是极其严重的错误。假如
设置了 MTS,则 UGA 被分配在 large_pool_size,也就是说放在了共享内存里面,不同进程
(线程)之间可以共享这部分内存。在这个基础上,我们假设数据库存在并发执行 server
process 为 100 个,根据上面我们 4 个参数在 oracle8.1.7 下的默认值,我们来计算独立模式
下 PGA 的 大 致 大 小 。 由 于 会 话 并 不 会 经 常 使 用 create_bitmap_area_size 、