1.KEEP缓冲池
使用keep缓冲池的目的是将实体保留在内存,避免I/O操作
selectphysical_reads,block_gets,consistent_gets from v$buffer_pool statistics wherename=’KEEP’;
计算缓冲池命中率的公式:Hit Ratio=1-physical_reads/(block_gets+consistent_gets)
2.Recycle缓冲池
使用recycle缓冲池的目的是为了清除内存中的不再使用的数据块,如果“free buffer waits”统计数总是很高,可以确定recycle缓冲池过小:
确定recycle缓冲池大小的办法:使recycle缓冲池失效运行系通到稳定状态,查看default缓冲池中由本来需要置于recycle缓冲池中数据段的缓冲区数,除以4,该结果就可以用作recycle缓冲池的大小。
3.确定数据段置于keep还是recycle缓冲池
对于至少两倍DEFAULT缓冲池大小,并且占用系统整个I/O的一定百分比的数据段,那么最好放置于recycle缓冲池;
对于大小小于DEFAULT缓冲池的10%,并且占用至少系统整个I/O的1%的数据段,那么最好放置于keep缓冲池;
如果对表空间超过一个段时,可以通过查询V$SESSION_WAIT确定每个段的I/O操作。
如何识别和减少LRU Latch竞争
LRU latches规划了那些缓存中最近最少使用的缓冲区列表,使用DB_BLOCK_LRU_LATCHES参数可以设置数据库实例中的latches总数。
可以通过如下语句确定系统中是否有latch竞争:
selectchild#,sleeps/gets ratio from v$latch_children where name=’cache buffers lruchain’ ;
每个LRU latch的非命中率应少于1%,任何大于1%的latch说明存在竞争,通过如下语句查找出来:
select namefrom v$buffer_pool_statistics where lo_setid<=child_latch_number andhi_setid>=child_latch_numbers ;
通过增加系统的LATCHES总数和相关缓冲池的LATCHES数可以减少LRU latch竞争。所允许的LATCHES最大值应少于:number_of_cpus*2*3和number_of_buffers/50
调整排序区
如果经常进行大的排序,应增大参数SORT_AREA_SIZE的值,将参数SORT_AREA_SIZE和SORT_AREA_RETAINED_SIZE联合使用,更有利于使用大的排序区。
重新分配内存
在重新定义了oracle内存结构、调整了库快存、数据字典快存和快速缓存后,如果减少了这些结构中某一个结构的内存使用,就可能需要将内存分配到其他结构中;
在改变了oracle内存结构以后,oracle的内存需求也会改变。
减少整个内存使用
采用如下方法:
增加可用内存总数;
减少内存使用
优化数据字典高速缓存:
select sum(gets)"ReadRequests",sum(getmisses)"Reads not in Memory" from v$rowcache ;
Read Requests Reads not in Memory
------------- -------------------
4764 145
命中率=ReadRequests/ Reads not in Memory
若低于85%应增加 SHARED_POOL_SIZE
优化游标:
可用以下语句检测游标的命中率:
select * from v$session_cursor_cache ;
select * from v$system_cursor_cache ;
优化游标应综合考虑,若打开的游标过多则应用程序需要的内存增大,可能发生共享池内存被换出到虚存从而影响性能。以下三个INIT.ORA中的参数可影响游标的性能:
CLOSED_CACHED_OPEN_CURSORS 指示oracle当执行commit或rollback语句时,是否显式的关闭游标。如果游标需要反复使用可以设为false,否则应为true从而减少内存占用。
CURSOR_SPACE_FOR_TIME若为true指示oracle只要在sql共享区中有打开的游标就一直保存该区域,若其值为false oracle可将其换出内存,即使游标仍打开。只有共享池能保存所有打开的游标时才将其设为true。
OPEN CURSORS设定一个会话可同时打开的游标数。
注释:以上增加SGA分配的调整以SGA不被换出实存为限,否则SGA部分换出实存反而降低Oracle性能。
优化数据库对象:
管理表的动态分配。
SELECTTABLESPACE_NAME,SEGMENT_NAME,SUM(BYTES),COUNT(*) EXT_QUAN FROM DBA_EXTENT_NAME WHERE TABLESPACE_NAME=’USERS’AND SEGMENT_TYPE=’TABLE’ GROUP BY TABLE_NAME,SEGMENT_NAME ;
统计各表的动态分配次数,若分区太多说明next参数设置的太低了。
优化索引存储参数。
设置适当的PCTFREE、PCTUSED值。
**********************************************************************************
优化SGA
什么是SGA(系统全局区)
1、系统全局区(SGA)是一个分配给Oracle的包含一个 Oracle实例的数据库的控制信息内存段。
主要包括数据库高速缓存(the database buffer cache),
重演日志缓存(the redo log buffer),
共享池(the shared pool),
数据字典缓存(the data dictionary cache)以及其它各方面的信息。
db_block_buffers
1、数据高速缓冲区
2、访问过的数据都放在这一片内存区域,该参数越大,Oracle在内存中找到相同数据的可能性就越大,也即加快了查询速度。
3、db_block_buffers以块为单位,假如DB_BLOCK_SIZE=2K,db_block_buffers=3200,则占用内存=3200*2K=6400K。
share_pool_size
1、SQL共享缓冲池
2、该参数是库高速缓存和数据字典的高速缓存。
Log_buffer
1、重演日志缓冲区
sort_area_size
1、排序区
processes
1、同时连接的进程数
global_names
1、如果“数据库链路名”和它所要连接的“数据库”拥有相同的名字,则设置global_names = TRUE,
否则,设置global_names = FALSE
db_block_size
1、数据库块大小
2、Oracle默认块为2KB,太小了,因为如果我们有一个8KB的数据,则2KB块的数据库要读4次盘,才能读完,
而8KB块的数据库只要1次就读完了,大大减少了I/O操作。
3、数据库安装完成后,就不能再改变