Oracle基础知识--内存参数设置

1.SGA区的大小

 

 SGA=log_buffer + Large_pool_size + java_pool_size + shared_pool_size + Data buffer

 SGA--原则:物理RAM的55%-58%;SGA不能太小,Oracle性能会差,但是也不能过大,影响操作系统正常运作。

 log_buffer--原则:128K-1M 之间,不可太大

 Large_pool_size--原则:若不使用MTS,5-10M 之间,不应该太大;若使用MTS,20-30M

 Java_pool_size--原则:假如数据库没有使用java,建议20-30M

 Shared_pool_size--原则:这个参数对性能影响很大,通常为物理RAM的10%

 Data buffer--原则:SGA中主要设置对象,一般为可用内存40%。数据缓冲区,这个参数对性能影响也很大,建议在确定了SGA的大小,和分配完前面的内存,剩下的都可

以分配给Data buffer。Oracle9i设置数据缓冲区的参数为:Db_cache_size

 

 Oracle 9i 具有动态SGA的功能,用操作系统命令查看系统内存时,发现系统中还有空闲内存。 但为什么有时使用oracle 9i 的sql  > alter system set

db_cache_size=xxxxM 命令时数据库会报告错 -- 没有足够的内存. 这是由操作系统引起的吗?

 

 不是,原因在于此时SGA区中没有多余空闲内存。尽管系统中有空闲内存,但未分配给SGA 区。在oracle 9i 中 动态SGA的概念是无需经过关闭实例(instance), 修改初

始化参数文件和重启实例这一过程,就可动态调整 buffer cache 和 share pool 的大小。另外,动态SGA允许在实例运行时设置,下次启动时将有多少物理内存分配给SGA

这一数据库参数。SGA可用最大物理内存是由SGA_MAX_SIZE 参数来决定的。

 

 在启动实例时,大小为SGA_MAX_SIZE 的内存就分配给了SGA,SGA成员(buffer cache, share pool等)根据参数值也会获得相应的内存。

 

 实例启动后SGA的各成员所用内存之和可以小于SGA_MAX_SIZE。数据库管理员通过使用alter system命令来调整SGA成员间的内存分配。 当SGA中有足够多的空闲内存时,

增大share pool 或 buffer cache 才能完成,否则会报内存不足。另外Share pool 和 buffer cache 的尺寸也可动态缩小。 当实例已启动,SGA已达到 SGA_MAX_SIZE

值,可通过先减少某一成员的内存,再增加另一成员的内存来完成。

 

 SGA成员间是相互独立的,在成员间分配内存时,其和一定不能大于 SGA_MAX_SIZE , 并且db_cache_size 参数不能等于0。

 

 在OLAP与OLTP混合型的应用环境中,利用动态SGA的功能,可以根据不同时刻应用的优先级,来动态的调整buffer cache 和 share pool 的尺寸,以提高系统的性能 :

 

 a、当OLTP 应用 优先级高时,缩小 buffer cache 的值,增大 share pool 的值;

 b、当 OLAP 应用优先级高时,缩小 share pool 的值,增大buffer cache 的值

 

 2.PGA区的大小

 

 A、Sort_area_size  用于排序所占内存

 B、Hash_area_size 用于散列联接,位图索引

 这两个参数在非MTS下都是属于PGA ,不属于SGA,是为每个session单独分配的,在我们的服务器上除了OS + SGA,一定要考虑这两部分

 原则:OS 使用内存+ SGA + session*(sort_area_size + hash_area_size + 2M)  < 总物理RAM 为好

 

 3.内存设置基本原则

 

 db_block_buffer 通常可以尽可能的大,shared_pool_size 要适度,log_buffer 通常大到几百K到1M就差不多了

 

 4.如何使用大内存

 

 参考http://www.itpub.net/showthread.php?s=&threadid=124424&perpage=15&pagenumber=6http://www.itpub.net/356988.html

 

 1)首先要把windows 2000 advance server 的awe功能参数打开,在boot.ini文件里添加 /PAE的参数以支持4G以上内存。

 2)把oracle升级到9.2.0.6,关于oracle打补丁的文档请参考补丁随机文档按照文档作没出现错误;

 3)在windows在注册表 _Local_Machine software-oracle-home0中添加一个二进制值,名称为AWE_WINDOW_MEMORY ,值的单位为字节,我添加的是1G

 4)在oracle配置文件里修改参数:

 屏蔽db_cache_size参数,

 添加db_block_buffers=(A),A乘以db_block_size=你想要的db_cache_size

 添加USE_INDIRECT_DATA_BUFFERS=TRUE

 添加pre_page_sga = true

 添加_DB_BLOCK_LRU_LATCHES=64

 屏蔽sga_max参数(ORA-00385错误在存在sga_max时就出现,屏蔽之后就没了)

 5)保存。

 6)ok

 

 5. 内存有关的视图

 

 --select * from v$sga_dynamic_components

 --select * from v$sga_dynamic_free_memory

 --select * from v$pgastat

 --select * from v$sga

 --select * from v$sgastat

 SELECT NAME, PHYSICAL_READS, DB_BLOCK_GETS, CONSISTENT_GETS,

       1 - (PHYSICAL_READS / (DB_BLOCK_GETS + CONSISTENT_GETS)) "Hit Ratio"

  FROM V$BUFFER_POOL_STATISTICS;

 

 6. buffer cache 调整建议

 

 SELECT size_for_estimate, buffers_for_estimate, estd_physical_read_factor, estd_physical_reads

    FROM V$DB_CACHE_ADVICE

    WHERE name          = 'DEFAULT'

      AND block_size    = (SELECT value FROM V$PARAMETER WHERE name = 'db_block_size')

      AND advice_status = 'ON';

 

 根据以上建议调整db_cache_size

 

 A common mistake is to continue increasing the buffer cache size. Such increases have no effect if you are doing full table scans or

operations that do not use the buffer cache

 

 7. 让小表驻留内存(DB_KEEP_CACHE_SIZE 初始化参数)

 

 alter table t  storage(buffer_pool keep);

 

8.AWE_WINDOW_MEMORY实现故障解决

 

在Oracle8.1.7版本以下启动数据库的时候不用设置AWE_WINDOW_MEMORY的最小值,而在Oracle9.2.0的版本中则强制要设置AWE_WINDOW_MEMORY的最小值,这个最小值在

Oracle8.1.7中通过DB_BLOCK_LRU_LATCHES参数设定,在Oracle9.2.0中则通过_DB_BLOCK_LRU_LATCHES隐含参数设定,Oracle9.2.0的AWE_WINDOW_MEMORY的最小值由以

下的公式计算:

MIN(AWE_WINDOW_MEMORY)=(4096 * DB_BLOCK_SIZE * _DB_BLOCK_LRU_LATCHES)/8 

_DB_BLOCK_LRU_LATCHES = (Max buffer pools * SETS_PER_POOL) 

Max Buffer Pools是个常量,等于8,SETS_PER_POOL是个变量,它的大小由是否启用VLM(即设定USE_INDIRECT_DATA_BUFFERS=TRUE参数)决定:

SETS_PER_POOL = 2* CPU_COUNT (启用 VLM) 

SETS_PER_POOL= CPU Count /2 (不启用VLM) 

例如:

CPU's = 16 

DB_BLOCK_SIZE = 8192 

Total RAM = 16 GB 

SETS_PER_POOL = 2 * CPU_COUNT = 32 

_DB_BLOCK_LRU_LATCHES = (max buffer Pools * sets_per_pool) = 8*32 = 256 MIN(AWE_WINDOW_MEMORY)=(4096*DB_BLOCK_SIZE*_DB_BLOCK_LRU_LATCHES)/8 =(

4096 * 8192 * 256) / 8 = 1073741824 bytes = 1024 MB 

这样在Windows的注册表中的HKLM\Software\Oracle\Homex下的AWE_WINDOW_MEMORY值至少是1024M,否则就会提示错误:

ORA-27102 out of memory 

OSD-00034 Message 34 not found; Product=RDBMS;facility =SOSD 

O/S Error: (OS 8) Not enough storage is available to process this command

posted on 2008-06-25 11:03  afant  阅读(996)  评论(0编辑  收藏  举报

导航