内容摘要:数据库系统的性能最终了决定数据库的可用性和生命力。大多数数据库系统在运行一段时间后都会存在一定的性能问题,主要涉及数据库硬件、数据库服务器、数据库内存、应用程序、操作系统、数据库参数等方面。因此,基于数据库系统的性能调整与优化对于整个系统的正常运行起着至关重要的作用。数据库性能调整与优化涉及到多个层面,通过统一规划、系统分析做出相应的调整,可以提高数据库的稳定性和可用性,保障系统高效地运行,解决系统瓶颈,节约系统开销,具有良好的应用价值,同时也对理论研究提供了一定的方法指导。基于此,论文将Oracle10g数据库的内存分配、磁盘I/O以及SQL语句等方面的性能调整与优化问题作为主要研究内容,对其进行了深入地分析和讨论,给出了一般情况下Oracle数据库应用系统的性能调整策略及优化方法。关键词:Oracle10g数据库;体系结构;系统全局区;性能调整与优化AbstractAbstract:Theperformanceofdatabasesystemseventuallydeterminestheiravailabilityandsurvivability.Mostofthemwillbringaboutsomeperformanceproblemsmoreorlessafterrunningforaperiodoftime,whichmainlyinvolvedatabasehardware,databaseserver,databasememory,applications,operatingsystemsanddatabaseparameters,etc.Therefore,performancetuningandoptimizationofdatabasesystems,whichconcernmultipleaspects,areveryvitaltothenormalrunningofthewholesystem.Wecanimprovethestabilityandavailabilityofdatabase,guaranteeitshighrunningefficiency,solvesystembottleneck,reducesystemoverhead,obtainconsiderableapplicabilityandinthemmeanwhile,providesomeguidelinesfortheoreticalresearchthroughaunifiedplanandsystematicalanalysistomakeappropriateadjustment.Basedontheabove-mentionedidea,thepaperprincipallypaysattentiontotheresearchontheperformancetuningandoptimizationproblemsofmemoryallocationofOracle10g,discI/O,SQLstatements,etc,andmakesafurtheranalysisanddiscuss.Besides,itprovidessomeperformancetuningstrategiesandoptimizationapproachesofOracleapplicationsystemingeneralcondition.KeyWords:Oracle10gDatabase不Architecture不SystemGlobalArea不AdjustmentandOptimizationofPerformance1导言网格技术是本世纪初最新和最有吸引力的技术之一,数据库管理系统作为信息系统的基本支撑在信息化建设中扮演着重要的要色。目前的Oracle10g数据库是业界首个为网格计算而设计的数据库,是一种高效率、可靠性好的适应高吞吐量的数据库解决方案,该方案可让客户将多台标准服务器系统整合成一套可扩充的容错运算平台。然而,随着数据库规模的扩大及用户数量的增加,数据库应用系统的响应速度下降,性能问题越来越突出。Oracle10g数据库系统体系结构庞大、技术细节繁杂,如何合理有效地建立基于Oracle的数据库系统及如何调整使系统性能达到最优,成为Oracle数据库应用领域的热点问题。本课题通过对Oracle10g数据库系统的深入分析,设计一套完整的Oracle数据性能评测指标和方法,并针对发现的性能问题制定相应的性能优化策略。2Oracle10g体系结构Oracle数据管理系统是Oracle实例(Instance)和Oracle数据库构成的。下面是Oracle10g数据库的体系结构图:图1Oracle10g数据库体系结构2.1ORACLE实例Oracle实例包括系统全局共享区SystemGlobalAre和后台进程BackgroundProcess。2.1.1系统全局共享区SystemGlobalArea(SGA)SystemGlobalArea是一块巨大的共享内存区域,他被看做是Oracle数据库的一个大缓冲池,这里的数据可以被ORACLE的各个进程共用[1]。其大小可以通过如下语句查看:SQLselect*fromv$sga;NAMEVALUE-----------------------------FixedSize39816VariableSize259812784DatabaseBuffers1.049E+09RedoBuffers327680主要包括以下几个部分:2.1.1.1共享池(Sharedpool)共享池是SGA中最关键的内存片段,特别是在性能和可伸缩性上。一个太小的共享池会扼杀性能,使系统停止,太大的共享池也会有同样的效果,将会消耗大量的CPU来管理这个共享池。不正确的使用共享池只会带来灾难。共享池主要又可以分为以下两个部分:(1)SQL语句缓冲(LibraryCache)当一个用户提交一个SQL语句,Oracle会将这句SQL进行分析(parse),这个过程类似于编译,会耗费相对较多的时间。在分析完这个SQL,Oracle会把他的分析结果给保存在Sharedpool的LibraryCache中,当数据库第二次执行该SQL时,Oracle自动跳过这个分析过程,从而减少了系统运行的时间。这也是为什么第一次运行的SQL比第二次运行的SQL要慢一点的原因。下面举例说明parse的时间SQLselectcount(*)fromscpass;COUNT(*)----------243Elapsed:00:00:00.08这是在Share_pool和Databuffer都没有数据缓冲区的情况下所用的时间SQLaltersystemflushSHARED_POOL;Systemaltered.清空Share_pool,保留DatabufferSQLselectcount(*)fromscpass;COUNT(*)----------243Elapsed:00:00:00.02SQLselectcount(*)fromscpass;COUNT(*)----------243Elapsed:00:00:00.00从两句SQL的时间差上可以看出该SQL的Parse时间约为00:00:00.02。对于保存在共享池中的SQL语句,可以从V$Sqltext、v$Sqlarea中查询到,对于编程者来说,要尽量提高语句的重用率,减少语句的分析时间。一个设计的差的应用程序可以毁掉整个数据库的Sharepool,提高SQL语句的重用率必须先养成良好的变成习惯,尽量使用Bind变量。(2)数据字典缓冲区(DataDictionaryCache)显而易见,数据字典缓冲区是ORACLE特地为数据字典准备的一块缓冲池,供ORACLE内部使用。2.1.1.2块缓冲区高速缓存(DatabaseBufferCache)这些缓冲是对应所有数据文件中的一些被使用到的数据块。让他们能够在内存中进行操作。在这个级别里没有系统文件,户数据文件,临时数据文件,回滚段文件之分。也就是任何文件的数据块都有可能被缓冲。数据库的任何修改都在该缓冲里完成,并由DBWR进程将修改后的数据写入磁盘[2]。这个缓冲区的块基本上在两个不同的列表中管理。一个是块的“脏”表(DirtyList),需要用数据库块的书写器(DBWR)来写入,另外一个是不脏的块的列表(FreeList),一般的情况下,是使用最近最少使用(LeastRecentlyUsed,LRU)算法来管理。块缓冲区高速缓存又可以细分为以下三个部分(Defaultpool,Keeppool,Recyclepool)。如果不是人为设置初始化参数(Init.ora),ORACLE将默认为Defaultpool。由于操作系统寻址能力的限制,不通过特殊设置,在32位的系统上,块缓冲区高速缓存最大可以达到1.7G,在64位系统上,块缓冲区高速缓存最大可以达到10G。2.1.1.3重做日志缓冲区(Redologbuffer)重做日志文件的缓冲区,对数据库的任何修改都按顺序被记录在该缓冲,然后由LGWR进程将它写入磁盘。这些修改信息可能是DML语句,如(Insert,Update,Delete),或DDL语句,如(Create,Alter,Drop等)。重做日志缓冲区的存在是因为内存到内存的操作比较内存到硬盘的速度快很多,所以重作日志缓冲区可以加快数据库的操作速度,但是考虑的数据库的一致性与可恢复性,数据在重做日志缓冲区中的滞留时间不会很长。所以重作日志缓冲区一般都很小,大于3M之后的重作日志缓冲区已经没有太大的实际意义。2.1.1.4Java程序缓冲区(JavaPool)Java的程序区,Oracle8I以后,Oracle在内核中加入了对Java的支持。该程序缓冲区就是为Java程序保留的。如果不用Java程序没有必要改变该缓冲区的默认大小。2.1.1.5大池(LargePool)大池的得名不是因为大,而是因为它用来分配大块的内存,处理比共享池更大的内存,下面对象使用大池:MTS——在SGA的LargePool中分配UGA。语句的并行查询(ParallelExecutionofStatements)——允许进程间消息缓冲区的分配,用来协调并行查询服务器。备份(Backup)——用于RMAN磁盘I/O缓存。2.1.2后台进程(Backgroundprocess)后台进程是Oracle的程序,用来管理数据库的读写,恢复和监视等工作。ServerProcess主要是通过他和userprocess进行联系和沟通,并由他和userprocess进行数据的交换。在Unix机器上,Oracle后台进程相对于操作系统进程,也就是说,一个Oracle后台进程将启动一个操作系统进程;在Windows机器上,Oracle后台进程相对于操作系统线程,打开任务管理器,我们只能看到一个ORACLE.EXE的进程,但是通过另外的工具,就可以看到包含在这里进程中的线程。在Unix上可以通过如下方法查看后台进程:ps–ef|grepora_#ps-ef|grepora_|grepXCLUATOracle2943110Sep022:02ora_dbwr_SIDOracle2944410Sep020:03ora_ckpt_SIDOracle2944810Sep022:42ora_smon_SIDOracle2944210Sep023:25ora_lgwr_SIDOracle2942710Sep020:01ora_pmon_SID2.1.2.1Oracle系统有5个基本进程他们是:DBWR(数据文件写入进程)LGWR(日志文件写入进程)SMON(系统监护进程)PMON(用户进程监护进程)CKPT(检查点进程,同步数据文件,日志文件,控制文件)(1)DBWR(DatabaseWriter数据写入进程)将数据缓冲区的数据写入数据文件