(原作者:陈博)摘要:各个领域中,对数据库的使用力度不断增加:更多的企业级数据库被使用,使用情况多样化、数据库容量增大化的趋势明显。与此同时,基于实际业务需要的应用也想数据库提出了更高效率的要求:数据库调优势在必行。报告的作者具有多年大型系统开发和企业级数据库维护的经验,基于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执行语句
时间: 2025-01-13 18:50:19
开发人员如何优化ORACLE执行语句的相关文章
如何用vs2013开发人员命令提示工具执行一个方法(一个简单的demo)
在任何一个编辑器中编写一个静态的Main方法,必须是静态且名为Main的方法,并将Main方法所在的类文件命名为yang.cs(这个名字随便命名),如图-1. 图-1 打开你的vs2013开发人员命令提示,如图-2. 图-2 注意图-2中的第一行是一个路径,将名为yang.cs的类文件放入到这个路径中,如图-3. 图-3 在vs2013开发人员命令提示中输入csc yang.cs,并按下回车键,如图-4. 图-4 再看看路径下发生了什么(生成了一个yang.exe的可执行程序),如图-5. 图-
优化SQL执行路径提高报表性能
报表出现性能问题需要对数据源计算进行优化时,执行路径难以确定从而被干预是阻碍报表优化的难题之一.由于数据库执行路径对开发人员不透明,报表优化需要指定执行路径时,程序员会很难甚至无法干预.而一般报表工具不具备强计算能力,大部分计算仍然要依靠数据库进行,这就导致很多报表优化效果不理想. 不同于一般报表工具,润乾集算报表内置了专门用于数据计算的集算引擎,开发人员可以通过编写集算脚本完成报表数据源准备.与数据库执行SQL路径不可控相比,集算脚本的执行过程是可控的,开发人员可根据实际情况编写或更改计算执行
经典案例:如何优化Oracle使用DBlink的SQL语句
转自 https://blog.csdn.net/Enmotech/article/details/78788083 作者介绍 赵全文 就职于太极计算机股份有限公司,在中央电化教育馆做Oracle DBA的驻场运维工作.具有3年左右的Oracle工作经验,目前擅长Oracle数据库的SQL脚本编写.故障诊断和性能优化,并且乐于分享Oracle技术. 一般在DBLINK的SQL语句中,将调用远程表的in-line view结果集返回的数据尽量减少,进而达到通过网络传输的数据减少的目的,而且也不会将
【转】Oracle 执行动态语句
1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型:另外一种是后期联编(late binding),即SQL语句只有在运行阶段才能建立,例如当查询条件为用户输入时,那么Oracle的SQL引擎就无法在编译期对该程序语句进行确定,只能在用户输入一定的查询条件后才能提交给SQL引擎进行处理.通常,静态SQL采用前一种编译方式,而动态SQL采用后一种编译方式.
Oracle性能优化之执行计划管理_超越OCP精通Oracle视频教程培训31
Oracle性能优化之执行计划管理_超越OCP精通Oracle视频教程培训31 本课程介绍: Oracle视频教程,风哥本套oracle教程培训<<Oracle数据库性能优化培训教程>>的第1/10套:Oracle性能优化之执行计划管理.主要学习Oracle性能优化简介,SQL 语句处理流程,软解析和硬解析,绑定变量及案例,游标的介绍,Oracle的优化器,执行计划的查看,SQL语句访问路径,SQL语句的连接方式,Oracle驱动表,执行计划的干预,常用hint提示的使用. 视频教
Oracle SQL语句优化34条
非常好用的SQL语句优化34条 1)选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基 础表.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. (2) WHERE子句中的连接顺序.: ORACL
Oracle Sql语句优化
1.最高效的删除重复记录方法 (因为使用了ROWID) 例子: DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_NO = E.EMP_NO); 2.在含有子查询的 SQL 语句中 , 要特别注意减少对表的查询 例子: SELECT TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = (SELECT TAB_NAME,DB_V
Oracle执行SQL查询语句的步骤
sql语句的执行主要由用户进程与服务器进程来完成,其他的一些进程可能要辅助完成这一过程. 查询语句与其他的sql语句有所不同,如果一个查询语句执行成功,就要返回查询结果,而其他的sql语句只是返回执行成功或失败的信息. 查询语句的主要 SQL语句的执行主要由用户进程与服务器进程来完成,其他的一些进程可能要辅助完成这一些过程. 查询语句与其他的SQL语句有所不同,如果一个查询语句执行成功,就要返回查询结果,而其他的SQL语句只是返回执行成功或执行失败的信息. 查询语句的处理主要包括以下3个阶段:编
浅谈ORACLE SQL语句优化经验
(1) 选择最有效率的表名顺序(只在基于规则的seo/' target='_blank'>优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. (2) WHERE子句中的连接顺序.