码迷,mamicode.com
首页 > 数据库 > 详细

开发人员如何优化ORACLE执行语句

时间:2014-12-03 10:26:21      阅读:234      评论:0      收藏:0      [点我收藏+]

标签:http   ar   os   使用   sp   文件   数据   art   问题   

(原作者:陈博)摘要:各个领域中,对数据库的使用力度不断增加:更多的企业级数据库被使用,使用情况多样化、数据库容量增大化的趋势明显。与此同时,基于实际业务需要的应用也想数据库提出了更高效率的要求:数据库调优势在必行。报告的作者具有多年大型系统开发和企业级数据库维护的经验,基于SQL语句在Oracle数据库中的执行逻辑,在以下报告中提出多种数据库优化的方法,从而达到提高Oracle数据库性能、改善应用系统运行环境的目的。
关键词:数据库;共享池;扫描;索引
中图分类号:NA 文献标识码:A 文章编号:1671-7597(2011)0220021-01
Oracle数据库调优,是软件工程师和数据库管理员群体中永恒的话题。每一个技术人员,都基于自身对各自系统的了解,有着不同的调优方法。
作者从事航空结算领域的系统开发有六年之久,所接触的系统均有着这一行业中系统的显著特征,即业务逻辑复杂、数据处理量大、数据处理效率要求高。另外,开发团队人数众多,且大多数情况是每个人分别实现不同业务模块。
以上环境因素,造成开发人员在实际开发工作中,对数据库结构设计的自由度大大降低。因此,如何编写高效的、实现具体业务逻辑的SOL语句,就显得非常重要。技术人员通过对ORACLE数据库中SOL语句执行过程的了解,可以有针对性地改善运行语句的步骤和处理逻辑,大幅度缩减SQL语句运行时间,从而提高单位时间内的数据处理量。
在ORACLE数据库中,SOL语句的执行过程大致可以分为解析、执行和提取运行结果三步。那么,如何在具体开发过程中优化执行语句呢?接下来我们将具体讨论。
1、对解析过程的优化
SOL语句提交给ORACLE后,首先需要计算的是语句数值,同时查找是否存在共享池中与此语句数值相同的其他语句,以及共享池中是否存在与此语句字符完全匹配的语句。其中,第二种条件的优先级高于第一种条件。也就是说,最理想的步骤,是在计算语句数值之后,找到共享池中值相同并且字符完全匹配的语句后直接执行。如果ORACLE接受了一个与共享池中的语句相一致的语句,这个语句就会被重用。因此,在解析阶段,优化的秘诀是使ORACLE接受一个已经在共享池中存在的语句,这样运行的效率,相比准备新的语句要高得多。
另外,Oracle为开发人员提供了充足的在数据库中存储代码的能力。充分利用包括存储过程、触发器、程序包、函数等在内的内部对象,使得数据库可以直接访问共享池,而不使用外部资源。可以说,用数据库中存储的程序代码设计应用系统,数据库的运行会更加高效。因此,在对现有系统进行维护性开发或优化工作的过程中,建议检查所有的事务处理以及主要的通用过程,研究其处理程序是否可以转换为数据库中存储的程序代码。如果可以用Oracle中的过程、程序包、函数、触发器等来实现,将大大提高应用程序的运行速度。
尤其是在以金融、航空领域为代表的大型软件,其应用于业务模块的时间动辄数年,而技术手段的更新日新月异,这就很可能造成同一套软件由多种开发工具开发的情况。不同开发工具间的交互,往往造成了应用系统的低效率运行。如果能将主要逻辑运算方法在数据库中编译和保存,将有利于系统整体运行效率的提升。
2、对语句执行和结果提取的优化
受Oracle内部机制影响,不同的SQL语句,其执行过程的组合也是多种多样。因此,在优化SQL语句的过程中,有诸多因素需要考虑。
首先,是在开发过程中,需要避免无计划的全表扫描。全表扫描,是在数据库中,对无索引的表进行查询。全表扫描,会消耗大量的服务器资源,因为数据库服务器会搜寻表的每一条记录,直到所有符合给定条件的记录返回为止。尤其是在航空结算系统或者金融行业的系统,因为主要数据库表的数据量动辄达到千万级,一旦对这些表进行全表扫描,会引起数据库资源被大量占用,从而使得应用性能大幅下降。因此,在实际开发过程中,要基于业务需要,尽量设计好表的结构,避免没有必要的全表查询动作。
其次,开发人员要妥善管理好一类语句,即包含视图的SQL语句。由于数据已经存在于实体表集合中,对于应用程序主要逻辑运算、系统提交物的生成,尤其是诸多报表的生成,需要建立大量视图,以获得两张或两张以上表的联合数据集。在Oracle中运行包含视图的SOL语句,优化器一般会有两种执行查询的方法:其一是在解决视图后执行查询,另外一种是把视图文本本身集成到查询里去。第一种方法经常会导致查询语句性能的下降,下降程度取决于所涉及表的相对大小,涉及表的结构越复杂、记录越多,对性能的影响程度越大。如果是视图集成到查询中去,除了查询的条件本身可以应用于视图中,还可以直接使用中间结果集,也被称为结果子集。这里有一点需要注意的是,如果视图本身包含集合的操作,例如Group by、SUM、COUNT或者DISTINCT等动作,则不适用于此类方法。
最后,是其他一些在实战中积累的,可能提高数据库性能的经验。从本质上来讲,数据库效率变低来源于数据量的增加。有效地分流查询数据量可以使效率得到显著提升。这就要提到对数据进行必要的归档操作。一般根据具体业务需要和服务要求,在线数据的最长保留期限不会超过24个月,而在线长记录的保留时限会更短。为提升系统整体运行效率,应及时将过期(超出业务要求的)在线长记录从生产表中移除,转而以短记录的方式保存在数据库的历史表中以便日后查询,而这些在线短记录,也应及时从在线数据库中移出,最终根据具体业务要求,保存在相应的文件服务器或磁盘阵列中。
将在线数据量稳定在一个固定的水平后,还需要为访问频繁且数据相对稳定的表创建充分并且符合业务需要的索引。Oracle会在语句运行前,查找使消费最低的索引加以引用,从而避免更多的扫描时间。这里特别需要指出的是,单单建立索引对于很多大型数据库而言是不够的,数据库管理人员还需要定期对索引进行重建。这是因为在复杂的系统操作过程中,表中的记录会以很高的频率被修改、删除或者插入。这些操作(除了大量插入记录外)虽然不会对表本身的大小产生量级的影响,但其使用的索引空间使用量却不会因为记录的减少而降低,范围会不断增加。重建索引则解决了这一问题,那些曾被删除记录使用的空间被有效回收,进而提高了数据库在空间上的利用率。

开发人员如何优化ORACLE执行语句

标签:http   ar   os   使用   sp   文件   数据   art   问题   

原文地址:http://www.cnblogs.com/wenxiaoshushu/p/4139252.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!