基于oracle9i的数据库查询优化技术

来源 :硅谷时代 | 被引量 : 0次 | 上传用户:duxiaoqingdu
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  [摘 要] 如何提高数据库的效率,是数据库使用过程中的一项重要任务,本文以oracle9i数据库为例,着重从改善用户的查询计划这方面,说明了改善查询技术的重要性,以及归纳出几种改善用户查询优化的方法。
  [关键词] 数据库 查询优化 查询计划 oracle 9i
  
  数据库系统是管理信息系统的核心,基于数据库的联机事务处理(OLTP)以及联机分析处理(OLAP)是银行、企业、政府等部门最为重要的计算机应用之一。从大多数系统的应用实例来看,查询操作在各种数据库操作中所占据的比重最大,而查询操作所基于的SELECT语句在SQL语句中又是代价最大的语句。举例来说,如果数据的量积累到一定的程度,比如一个积累到上千万条记录的商业数据库表,全表扫描一次往往需要数十分钟,甚至数小时。如果采用比全表扫描更好的查询策略,往往可以使查询时间降为几分钟,据统计,90%的性能问题是由于程序员或用户使用了不恰当的查询语句造成的,而不良的SQL语句往往来自于不恰当的索引设计、不充分的条件和不可优化的where子句。在进行恰当的优化后,运行速度就会明显的提高。因此,如何设计高效合理的查询语句就显得非常重要。本文以Oracle9i数据库应用实例为基础,结合数据库理论,介绍查询优化技术在现实系统中的运用。
  
  一、据统计90%的性能问题是由于程序员或用户使用了不恰当的查询语句造
  
  许多程序员在利用一些前端数据库开发工具(如PowerBuilder、Delphi等)开发数据库应用程序时,由于在项目时间紧迫等诸多方面的压力之下往往只关注所得的结果是否正确,以及用户的界面是否华丽并不重视查询语句的效率问题,导致所开发出来的应用系统效率低下,资源浪费严重。因此,如何设计高效合理的查询语句就显得非常重要。
  许多程序员认为查询优化是DBMS(数据库管理系统)的任务,与程序员所编写的SQL语句关系不大,其实这是错误的。一个好的查询计划往往可以使程序性能提高数十倍甚至更多。查询计划是用户所提交的SQL语句的集合,查询规划是经过优化处理之后所产生的语句集合。DBMS处理查询计划的过程是这样的:在做完查询语句的词法、语法检查之后,将语句提交给DBMS的查询优化器,优化器做完代数优化和存取路径的优化之后,由预编译模块对语句进行处理并生成查询规划,然后在合适的时间提交给系统处理执行,最后将执行结果返回给用户。
  
  二、优化查询计划的方法
  
  系统所做查询优化我们暂不讨论,下面重点说明改善用户查询计划的解决方案。下面以关系数据库系统Oracle9i为例,介绍改善用户查询计划的方法。
  1.避免使用不兼容的数据类型。
  如float和int、char和varchar是不兼容的。数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化操作。例如:
  SELECT name FROM employee WHERE salary>10000
  在这条语句中,如salary字段是money型的,则优化器很难对其进行优化,因为10000是个整型数。我们应当在编程时将整型转化成为money型,而不要等到运行时再转化。
  2.合理使用索引
  索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构。索引的使用要恰到好处,其使用原则如下:
  ● 在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。
  ● 在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。
  ● 在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。
  ● 如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。服务器上,索引可能失效或者因为频繁操作而使得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用工具检查索引的完整性,必要时进行修复。另外,当数据库表更新大量数据后,删除并重建索引可以提高查询速度。
  3.避免或简化排序
  应当简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。以下是一些影响因素:
  ● 索引中不包括一个或几个待排序的列;
  ● group by或order by子句中列的次序与索引的次序不一样;
  ● 排序的列来自不同的表。为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表(尽管有时可能影响表的规范化,但相对于效率的提高是值得的)。如果排序不可避免,那么应当试图简化它,如缩小排序的列的范围等。
  4.用外联接提高表连接的查询速度
  在作表连接(常用于视图)时,常使用以下方法来查询数据:
  SELECT PAY_NO,PROJECT_NAME
  FROM A
  WHERE A.PAY_NO NOT IN (SELECT PAY_
  NO FROM B WHERE VALUE >=120000);
  但是若表A有10000条记录,表B有10000条记录,则要用掉30分钟才能查完,主要因为NOT IN要进行一条一条的比较,共需要10000*10000次比较后,才能得到结果。该用外联接后,可以缩短到1分左右的时间:
  SELECT PAY_NO,PROJECT_NAME
  FROM A,B
  WHERE A.PAY_NO=B.PAY_NO(+)
  AND B.PAY_NO IS NULL
  AND B.VALUE >=12000;
  5.避免相关子查询
  一个列的标签同时在主查询和where子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。
  6.使用临时表加速查询
  把表的一个子集进行排序并创建临时表,有时能加速查询。它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。例如:SELECT cust.name,rcvbles.balance,……other columns FROM cust,rcvbles WHERE cust.customer_id=rcvlbes.customer_id AND rcvblls.balance>0 AND cust.postcode>“98000”ORDER BY cust.name如果这个查询要被执行多次而不止一次,可以把所有未付款的客户找出来放在一个临时文件中,并按客户的名字进行排序:SELECT cust.name,rcvbles.balance,……other columns FROM cust,rcvbles WHERE cust.customer_id=rcvlbes.customer_id AND rcvblls.balance>0 ORDER BY cust.name INTO TEMP cust_with_balance 然后以下面的方式在临时表中查询:SELECT*FROM cust_with_balance WHERE postcode>“98000”临时表中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘I/O,所以查询工作量可以得到大幅减少。注意:临时表创建后不会反映主表的修改。在主表中数据频繁修改的情况下,注意不要丢失数据。
  7.避免相关子查询
  一个列的标签同时在主查询和where子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。
  8.用排序来取代非顺序存取
  非顺序磁盘存取是最慢的操作,表现在磁盘存取臂的来回移动。SQL语句隐藏了这一情况,使得我们在写应用程序时很容易写出要求存取大量非顺序页的查询。有些时候,用数据库的排序能力来替代非顺序的存取能改进查询。
  
  三、小结
  
  数据库的查询在数据库的操作中占了相当大的比重,提高数据库的效率,主要在于提高数据库的查询。通过以上对数据库查询优化的探讨,我们知道对于数据库的查询优化重点就在于SQL语句的执行效率,因此抓住了这个重点,有针对性得进行进一步的实践,反复比较就可以得出最优的方案。
  
  参 考 文 献
  [1] 科里M.J.著,张福德译Oracle数据库性能优化技术,学苑出版社,1994
  [2] 黄开枝,Oracle9i数据库性能调整与优化,清华大学出版社,2005年6月
  [3] 唐汉明,翟振兴,兰丽华,关宝军,申宝柱,人民邮电出版社,2008年4月
  [4] 李俊民,精通SQL—结构化查询语言详解(第2版),人民邮电出版社,2008年8月■
其他文献
[摘 要] 随着我国经济体制的转变和市场经济体制的逐步建立,为使水利工程项目在投资和收益之间找到最佳结合点,对水利工程造价进行管理已成为管理决策者们共同关心的话题。本文对水利工程造价控制涵义、内容进行分析说明,重点对水利工程造价控制措施进行归类总结,主旨在于为水利工程造价确立造价控制原则等对建设项目实施阶段的造价管理与控制进行了分析  [关键词] 工程造价 控制    一、水利工程造价控制涵义  
期刊
[摘 要] 元数据的英文名称是“Metadata”,它是“关于数据的数据”。元数据实际上是解决最终用户在什么时间、地点以及以何种方式使用数据仓库的问题。本文讨论了数据仓库系统中元数据的内容、功能及其管理和维护。在Microsoft Metadata Service 和Open Information Model (OIM ) 模型的基础上, 给出了一个元数据管理和维护系统的实例。  [关键词] 元
期刊
[摘 要] 本文首先分析了双语教学的目的及定位,结合教学体会探讨“现代网络技术”课程的双语教学模式。使用英文原版教材、采用英汉交替讲解、运用多媒体教学、在实践中英语应用能力是有效的双语教学方法。  [关键词] 现代网络技术 双语教学 模式    现代网络技术是信息技术的前沿学科,为了能紧跟现代网络新技术发展的步伐,更好的参与国际竞争与合作,因此把双语教学运用于《现代网络》课程。本文结合《现代网络技
期刊
[摘 要] 本文首先分析了CMOS电路功耗的来源,基于这个理论基础介绍了三种RTL(寄存器传输)级的低功耗设计方法  [关键词] RTL 低功耗    一、引言    在半导体工艺水平不断进步的同时,以电池供电的手持设备和膝上电脑也迅速普及,系统的功耗有时已经成为系统设计首要考虑的因素,因此,低功耗设计成为发展移动系统必然要解决的问题。集成电路的低功耗设计分为系统级、RTL(寄存器传输)级、门级、
期刊
大学语文传统教学一直具有很大的优势,但随着信息技术的发展和广泛应用,大学语文传统教学受到了极大的挑战,一种新的教学模式,即基于信息技术环境下的教学模式----网络课堂教学模式迅速地深入到教学领域里,大有替代传统教学的势头。大约到了2000年前后,开始有越来越多的语文教师和专家学者注意到了单纯运用信息技术给语文教学带来的问题,认识到传统语文教学作为一种发展成熟、理论基础和文化积淀深厚的教育模式,自有
期刊
[摘 要] 软件测试在软件项目开发过程中起着越来越重要的作用,已经成为保障软件系统质量的关键步骤之一,本文结合湖南国税网上办税厅系统的开发工作,提出了基于B/S结构的应用系统的软件测试方法,从功能、性能、安全性方面讨论了如何在软件开发过程中进行软件测试工作。  [关键词] 网上办税厅 B/S结构 软件测试    湖南国税网上办税厅系统是税务信息化的阶段性工作成果,可实现网上税务登记、电子申报、网上
期刊
[摘 要] 动漫是一种融多种艺术、学科元素于一体的综合性艺术,并逐渐走入我们的日常生活,现代动画教育与传统教育的最大差异就在于传统教育是以书本为主的应试教育,而现代动画教育是以人为本的素质教育。现代职业教育的目标不是让学生毕业后就个个成为原创人才,但动画的制作特性和中国目前的动漫市场决定动画教育应贯穿原创动画,在原创的过程中学习理论知识,巩固技能;在原创的过程中提升学生创作素养、动手能力、合作能力
期刊
[摘 要] 体育教学是在“运动”这个独特的手段和固有的“教学”形式来达到教育人与培养人的目的,所以,体育教学中的审美教育是以培养学生的外在美与内在美为主要内容,使受教育者达到内外美的和谐统一。体育教师在教学过程中,通过的美育和德育的讲解和运用,可以使课堂上的气氛生动活跃,富有艺术感,并且使学生自觉的培养审美观、审美情趣、审美理想、审美情感和审美能力。  [关键词] 体育教学 审美教育 情感教育  
期刊
[摘 要] 对SOA的概念,结构和技术组成进行简要介绍,并提出适合税务系统的基于SOA的税务流程服务管理平台的技术组成方案  [关键词] SOA 税务流程服务管理平台    SOA即Service-oriented Architecture,就是面向服务的架构,是目前领先的、具整合能力的应用体系架构。META组织将SOA定义为:“一种以通用为目的、可扩展、具有联合协作性架构,所有流程都被定义为服务
期刊
[摘 要] 本文主要介绍了基于JAVA的数字到中文大写金额的转换具体实现方法,对其中如何实现不限制数字长度着重进行了说明,为了保证转换结果的正确性,对存在的中文大写金额书写规范进行了研究,在实现步骤上逐步进行说明,并对核心部分附上了源代码。  [关键词] JAVA 不限长度 数字 中文大写金额 转换    一、引言    在经济行业的工作中,经常需要将阿拉伯数字转中文大写金额,财务人员主要用于填写
期刊