第七篇 再述oracle数据库体系结构 之三:内存结构与动态内存管理
内存是影响数据库性能的重要因素。
oracle8i使用静态内存管理,即,SGA内是预先在参数中配置好的,数据库启动时就按这些配置来进行内在分配,oracle10g引入了动态内存管理,即在数据库运行过程中,内存大小可以在线修改与自动配置。
oracle数据库的内存可以分为:系统全局区、程序全局区、排序区、大池、java池。
一、系统全局区(SGA)
系统全局区的数据被多个用户共享。当数据库实例启动时,系统全局区内存被自动分配。SGA按作用的不同,又分为:数据缓冲区、日志缓冲区、共享池。
1.数据缓冲区
数据缓冲区用于存储从磁盘数据文件中读入的数据,供所有用户共享。修改、插入的数据存储在数据缓冲区中,修改完成或DBWR进程执行时,数据被写入数据文件。
几个概念:
LRU:最近最少使用,系统按这个原则对缓冲区中的数据进行替换。
Dirty:脏数据,指修改后还没有写到数据文件中的数据。
在9i之前,数据缓冲区的大小是由DB_BLOCK_BUFFER确定,之后的版本中,是由参数DB_CACHE_SIZE及DB_nK_CACHE_SIZE确定。不同的表空间可以使用不同的块大小,在创建表空间中加入参数BLOCKSIZE指定该表空间数据块的大小,如果指定的是2k,则对应的缓冲区大小为DB_2K_CACHE_SIZE参数的值,如果指定的是4k,则对应的缓冲区大小为DB_4K_CACHE_SIZE参数的值,以此类推。如果不指定BLOCKSIZE,则默认为参数DB_BLOCK_SIZE的值,对应的缓冲区大小是DB_CACHE_SIZE的值。
缓冲区的设置对性能影响是很突出的。设一个查询要读取的数据块数为A,能够从缓冲区读取到的数据块数为C,需要从磁盘读取的数据块数为D,那么A+C+D,则C/A称为数据缓冲区的命中率。以下语句计算数据缓冲区的命中率:
SQL>SELECT A.VALUE+B.VALUE "LOGICAL_READS",C.VALUE "PHYS_READS",
ROUND(100*((A.VALUE+B.VALUE)-C.VALUE)/(A.VALUE+B.VALUE)) "BUFFER HIT RATIO"
FROM V$SYSSTAT A,V$SYSSTAT C
WHERE A.STATICSTIC#=38 AND B.STATISTIC#=39 AND C.STATICSTIC#=40
一般要求命中率在90%以下,如果命中率太低,就应适当调整数据缓冲区的大小。
2.日志缓冲区
日志缓冲区用于缓冲事务日志,在适当的时候再由LGWR进程写入日志文件。日志缓冲区的大小由参数LOG_BUGGER设定。
日志在进入日志缓冲区时,如果日志缓冲区过小而没有空闲空间,就要等待LGWR将缓冲区中原有的日志写入日志文件以腾出空闲空间。如果有足够的空闲空间,则无需等待,直接写入日志缓冲区中。那么这个 等待的次数/总次数(等待+非等待) 就称为日志缓冲区的失败率,可以通过以下语句计算:
sql>select name,gets,misses,immediate_get,immediate_misses,
decode(gets,0,0,misses/gets*100 ratio1,
decode(immediate_gets+immdiate_misses,0,0,immediate_misses/(immdiate_gets+immediate_misses)*100) ratio2
from v$latch where name in ('redo allocation','redo copy');
显然,失败率也是影响性能的重要因素,就要实际情况调整log_buffer的大小。
3.共享池
共享池是对sql,pl/sql程序进行语法分析,编译,执行的内存区域。包括:库缓冲区(library cache),数据字典缓冲区(data dictinary cache),用户全局区(user global area)三个部分。
共享池的大小由参数shared_pool_size设定。
查询数据字典的成功与失败次数:
sql>select sum(gets) "dictionary gets",
sum(getmisses) "dictionary cache getmisses",
from v$rowcache
计算共享池记取数据字典的成功率:
sql>select parameter,gets,getmisses,getmisses/(gets+getmisses)*100 "miss ratio",(1-sum(getmisses)/sum(gets)+sum(getmisses))))*100 "hit ratio" from v$rowcache where gets+getmisses<>0 group by parameter,gets,getmisses;
计算缓存的失败率,结果应小于1%:
sql>select sum(pins) "total pins",sum(reloads) "total reloads",
sum(reloads)/sum(pins)*100 libcahe from v$librarycache;
以上分析了SGA的三个部分,要查看SGA的总大小或空闲空间,使用比率,如下:
sql>select * from v$sga
sql>select name,sgasize/1024/1024 "allocated(m)",bytes/1024 "空闲空间百分比(%)" from (select sum(bytes) sgasize from sys.v_$sgastat) s,sys.v_sgastat f where f.name='free mamory';
二、程序全局区
程序全局区(PGA)是包含单个用户或服务器数据的控制信息的内存区域。是在用户进程连接到oracle数据库并创建一个会话时,由oracle自动分配的,它是非共享区,主要用于在编程时存储变量与数组。会话结束时,PGA被释放。
三、排序区
排序区用于sql的order by。oracle优先使用排序区进行排序,如果内存不够,oracle自动使用临时表空间进行排序。
参数sort_area_size用于设置排序区的大小。
四、大池
大池用于数据库备份工具-RMAN。
大池的大小由参数large_pool_size确定。
五、java池
从8i开始,oracle增加了对java的支持,所以系统提供了java池,其大小由参数java_pool_size设定。
六、oracle10g的自动共享内存管理
1.什么是自动共享内存管理?
在10g以前的版本中,SGA的各个部分,share_pool_size,db_cache_size等需要由管理员手动设置大小,当数据库负荷太大时,若没有调整这些参数的大小,就会产生“无法分配内存”的错误。在10g中,将参数statistics_level设置为typecal 或all,再使用新参数SGA_TARGET设置SGA内存区的部大小即可,无需定义每个参数的大小,系统会根据需要自动在多个组件之间分配内存大小。
2.自动共享内存管理时,设置SGA各部分内存参数的最小值限制
如果同时设置了SGA_TARGET和各内存参数,如:
SGA_TARGET=300M
SHARED_POOL_SIZE=32M
DB_CACHE_SIZE=90M
则表示共享池和数据缓冲区至少会分配32M和90M内存,剩下的可由系统自动分配的内存为:
300-32-90=172M
3.手动内存管理转换为自动管理
只要设置新参数SGA_TARGET即可,如:
SGA_TARGET=1000M
在自动内存管理模式下,如果数据库使用SPFILE,那么在数据库关闭后,系统会将上一次数据库关闭时的内存分配状态记录下来。因此,如果是自动内存管理,最好使用SPFILE而非PFILE。
分享到:
相关推荐
以上是对Oracle数据库体系结构的基本介绍,深入学习还包括对Oracle的SQL语法、存储过程、触发器、视图、约束、分区表等特性的理解和应用。通过理解这些核心概念,可以更好地管理和优化Oracle数据库,提升系统的稳定...
Oracle 12c数据库体系结构图文详解手册是 Oracle 12c数据库管理系统的核心组件之一,该手册详细介绍了 Oracle 12c数据库的体系结构、实例、数据库、内存结构、后台进程、控制文件、重做日志文件、数据文件等概念。...
3. 掌握oracle数据库体系机构,为oracle优化奠定基础。 三、适合人群: 1.有意从事oracle 数据库工作,担任dba角色的人员; 2. Oracle数据库设计、开发和备份等管理人员; 四、课程内容: 第一讲:Oracle体系结构 ...
Oracle数据库的内存结构是其高效运行的关键组成部分,主要分为系统全局区(SGA)、程序全局区(PGA)、排序区、大池和Java池。本文将重点讨论SGA,它是Oracle数据库中最为重要的共享内存区域。 系统全局区(SGA)是...
总的来说,Oracle数据库体系结构复杂而强大,涵盖数据存储、内存管理、并发控制、安全性和高级特性等多个方面。对于新手而言,理解和掌握这些基础概念是进一步学习Oracle数据库管理和开发的前提。通过深入学习Oracle...
Oracle数据库体系结构是Oracle软件的核心部分,负责管理和存储数据以供用户和应用程序使用。Oracle数据库体系结构主要由以下几部分构成:Oracle数据库服务器、Oracle实例、Oracle数据库的物理结构和Oracle数据库的...
Oracle数据库管理体系结构是指Oracle数据库的逻辑和物理结构,它包括数据库的存储结构、进程结构、内存结构等方面。 Oracle数据库管理体系结构是Oracle数据库的核心组件,负责管理和维护数据库的所有资源和数据。 ...
Oracle数据库是全球广泛使用的大型关系型...总的来说,Oracle数据库体系结构是复杂而精细的,理解和掌握其核心组件和工作原理,对于数据库管理员、开发人员以及任何需要与数据库打交道的人来说,都是提升技能的关键。
Oracle数据库是业界广泛应用的关系型数据库管理系统,它的体系结构是理解和管理数据库的关键。Oracle数据库的体系结构可以分为物理结构和...对于希望深入掌握Oracle数据库体系结构的读者来说,需要进一步学习和实践。
综上所述,Oracle数据库体系结构是一个深度集成的系统,涉及内存管理、进程协调、数据存储和访问、事务处理、安全性等多个方面。理解和掌握这些概念对于有效地管理和优化Oracle数据库至关重要。
### Oracle数据库体系结构知识点 #### 一、Oracle体系结构简介 **Oracle Server**: Oracle服务器包含两个主要部分:数据库(Database)和实例(Instance)。 - **Database**: 包括数据文件(Datafiles)、控制文件...
《Oracle编程艺术-深入数据库体系结构》是一本深入解析Oracle数据库内部运作机制的专业书籍,对于想要提升Oracle数据库管理技能的IT从业者来说,是不可或缺的参考资料。本书主要涵盖了以下几个关键知识点: 1. ...
Oracle数据库体系结构是理解Oracle数据库工作原理的关键。Oracle体系结构主要由实例(Instance)、文件(File)和进程(Process)组成,其中不包括后台进程。本篇教程将深入讲解Oracle数据库的这些核心组件。 首先...
总结来说,Oracle数据库的体系架构是一个高度协调的系统,通过实例和内存结构优化了数据的访问和管理,同时通过各种后台进程和组件保证了数据的完整性和可用性。理解这些核心概念对于有效管理和优化Oracle数据库至关...
《Oracle9i&10g编程艺术:深入数据库体系结构》是一本内容丰富、深入浅出的专业书籍,适合所有希望深入了解Oracle数据库体系结构的读者阅读。无论是初学者还是经验丰富的专业人士,都能从中获得有价值的信息和实用的...
ORACLE 数据库体系结构、安全性策略浅析 本文将对 ORACLE 数据库的体系结构和安全性策略进行浅析,以帮助读者更好地理解 ORACLE 数据库的工作原理和安全机制。 一、ORACLE 数据库体系结构 ORACLE 数据库是一个...
### Oracle数据库体系结构详解 #### 一、Oracle数据库的核心竞争力 Oracle数据库因其强大的核心竞争力而闻名于世,这些优势体现在可扩展性、可靠性和可管理性三个方面。 **1. 可扩展性** - **定义**: Oracle...
《Oracle 9i&10g编程艺术:深入数据库体系结构》是一本专注于Oracle数据库9i和10g版本的深度解析书籍,旨在为读者提供关于Oracle数据库内部工作原理及编程技巧的详尽指南。该书由多个章节构成,覆盖了从数据库基本...
Oracle数据库是一种广泛使用的大型关系型数据库管理系统,其体系结构复杂且高效。理解Oracle数据库的体系结构对于管理和优化数据库性能至关重要。 首先,Oracle的逻辑结构主要包括以下几个部分: 1. **表空间...