ORACLE数据库学习之数据库的优化(六)

2014-11-24 17:07:31 · 作者: · 浏览: 3
为各缓冲池设置大小

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、数据库安装完成后,就不能再改变