欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

Oracle数据库性能优化之内存磁盘

程序员文章站 2022-05-21 12:52:29
...

Oracle一般采用自动内存管理来管理系统内存,由oracle自动管理和调整数据库实例的内存大

1,内存结构优化概述
1.1 缓冲区
影响数据库运行性能的缓冲区包括可以共享的SGA和服务器进程私有的pga两大类,其中sga又包括共享池、大型池、java池、数据缓冲区、流池、redo log缓冲区。

1.2 自动内存管理
Oracle一般采用自动内存管理来管理系统内存,由oracle自动管理和调整数据库实例的内存大小。在自动管理模式下,首先对初始化参数MEMORY_TARGET(目标内存大小)和MEMORY_MAX_TARGET(最大内存大小)进行配置,数据库调整目标内存大小,根据需要不断重新调整sga和pga的缓冲区大小。

1.3 共享内存sga的自动管理
如果数据库实例启动时候动态将初始化参数SGA_TARGET设置为0,则自动共享内存管理被禁止使用。每个缓冲区的大小由初始化参数文件中的相应参数来决定。如果有必要,可以通过手动设置初始化参数DB_CACHE_SIZE,SHARED_POOL_SIZE,LARGE_POOL_SIZE,JAVA_POOL_SIZE,STREAMS_POOL_SIZE,来调整共享内存区各个缓冲区的大小。一般通常有一些内存组件大小需要管理员手动设置,不受自动内存管理的影响,比如重做日志缓冲区;KEEP、RECYCLE以及基于非标准数据块的缓冲区;固定的SGA和其他内部分配的内存区。手动调整这些内存区时候,需要设置的初始化参数有DB_KEEP_CACHE_SIZE,DB_RECYCLE_CACHE_SIZE,DB_nK_CACHE_SIZE,LOG_BUFFER,这些内存区的分配都是从SGA_TARGET指定内存中获取,SGA_TARGET的余下部分供自动共享内存管理的各个缓冲区使用。

1.4 动态改变缓冲区大小
如果系统没有采用自动内存管理或者自动内存共享内存管理功能,可以使用ALTER SYSTEM语句配置初始化参数DB_ACHE_SIZE,JAVA_POOL_SIZE,LARGE_POOL_SIZE,LOG_BUFFER,SHARED_POOL_SIZE等。

2,数据缓冲区调整
通过下列两种方式检查数据缓冲区设置是否合理:

查看数据库缓冲区的命中率,执行命令:

select 1 - ((physical.value - direct.value -lobs.value) / logical.value)

"Buffer Cache Hit Ratio"

from v$sysstat physical,v$sysstat direct,v$sysstat lobs,v$sysstatlogical

where physical.name = 'physical reads'

anddirect.name='physical reads direct'

andlobs.name='physical reads direct (lob)'

andlogical.name='session logical reads';

运行结果:

SQL> select 1 - ((physical.value - direct.value - lobs.value) /logical.value)

2 "Buffer Cache HitRatio"

3 from v$sysstatphysical,v$sysstat direct,v$sysstat lobs,v$sysstat logical

4 where physical.name ='physical reads'

5 and direct.name='physicalreads direct'

6 and lobs.name='physical readsdirect (lob)'

7 and logical.name='sessionlogical reads';

Buffer Cache Hit Ratio

----------------------

0.958117758479709

SQL>

惯例来说,上述语句当>0.9实说明调整充分的。命中率是高的,这里已经为0.95,所以命中率还是比较可观的。对于数据库系统而言,数据缓冲区中包括的DEFAULT缓冲池就足够应用需要了。

查询数据缓冲区中每个缓冲区的逻辑读和物理读的信息,可以查询动态性能视图v$buffer_pool_statistics,例如:

SQL> selectt1.name,t1.PHYSICAL_READS,t1.DB_BLOCK_GETS,t1.CONSISTENT_GETS,1-(t1.PHYSICAL_READS/(t1.DB_BLOCK_GETS+t1.CONSISTENT_GETS))"Hit Ratio"

2 from v$buffer_pool_statisticst1

3 ;

NAME PHYSICAL_READS DB_BLOCK_GETSCONSISTENT_GETS Hit Ratio

-------------------- --------------------------- --------------- ----------

DEFAULT 44480354387 571096618 33595740186 -0.3018575

SQL>

调整数据缓冲区大小

如果数据缓冲区小于90%,就要考虑调整数据缓冲区大小。增大数据缓冲区之前,先看看V$DB_CACHE_SIZE(select * from v$db_cache_advice),确定数据缓冲区增大到多少能够显著降低物理I/O的数量,然后动态修改初始化参数DB_CACHE_SIZE。初始化参数DB_CACHE_SIZE对应的是标准数据缓冲区大小,如果要修改非标准的数据缓冲区大小,需要修改初始化参数DB_nK_CACHE_SIZE(n取值为2、4、8、16、32,且n不能是标准数据块大小)

3,共享池调整
3.1 库缓存命中率
可以通过查询动态性能视图v$librarycache(select * from v$librarycache;),该视图保存了数据库最近一次启动以来库缓存活动的统计信息,每一行记录反映了库缓存中一个条目类型的统计信息,通过namespace列值来识别每个条目类型。例如:

selectt1.NAMESPACE,t1.PINS,t1.PINHITS,t1.RELOADS,t1.INVALIDATIONS from v$librarycachet1 order by t1.NAMESPACE;

SQL> selectt1.NAMESPACE,t1.PINS,t1.PINHITS,t1.RELOADS,t1.INVALIDATIONS from v$librarycachet1 order by t1.NAMESPACE;

NAMESPACE PINS PINHITS RELOADS INVALIDATIONS

-------------------------------------------------------------------------- ---------- ---------- -------------

APP CONTEXT 2 1 0 0

BODY 28468616 28458242 1818 46