IOracle论文.docVIP

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
IOracle论文

浅谈Oracle中SQL语句优化 课程:Oracle数据库应用 学号: 20090307134 姓名: 钱国锋 班级: 09软件(1) 指导老师: 王磊 浅谈Oracle中SQL语句优化 SQL语句的主要功能之一是不需要确切地告诉数据库如何获得请求的数据,只需要执行一个查询,指定所需要的信息,然后数据库就会找到最好的方法获得它。一个数据库系统的生命周期可以分成设计、开发和获得成品这3个阶段。在设计阶段进行数据库性能优化,也就是通过优化SQL语句来改进性能,所需要的成本最低,收益最大。SQL语句的优化就是将性能较低的SQL语句转换成达到同样的目的的性能优异的SQL语句。 下面将介绍对于一般的SQL语句的优化技巧。 由于Oracle可以存储更多复杂的数据,这就使得数据的查询效率显得更为重要,低效率的查询给实际应用带来的麻烦是不可估量的。对于DELETE语句、SELECT子句、FROM子句和WHERE子句等都可以进行优化。 在SELECT子句查询表的所有列时,可以使用动态SQL列引用”*”,用来表示表中所有列。使用”*”代替所有的列,可以降低编写SQL语句的难度,减少SQL语句的复杂性,但是却降低了SQL语句执行的效率。 下面通过SQL语句的执行过程,来了解SQL语句的执行效率。当一条SQL语句从客户端进程传递到服务器端进程后,Oracle需要执行如下步骤: 在共享池中搜索SQL语句是否已经存在。 验证SQL语句的语法是否准确。 执行数据字典来验证表和列的定义 获取对象的分析锁,以便在语句的分析过程中对象的定义不会改变。 检查用户是否具有相应的操作权限。 确定语句的最佳执行计划 将语句和执行方案保存到共享的SQL区 首先使用SET TIMING ON语句显示执行时间。然后检索scott用户的emp表,使用”*”来替代所有的列名,执行语句和执行时间如下: SQLSET TIMING ON SQLSELECT * FROM scott.emp; 已用时间: 00:00:00.37 在SELECT子句中不使用”*”,而使用具体的列名,执行语句和执行时间如下: SQLSELECT empno , ename , job , mgr , hiredate , sal , comm , deptno FROM scott.emp; 已用时间: 00:00:00.26 从执行结果可以看出,第二条语句的执行时间小于第一条语句的执行时间。这是因为Oracle系统需要通过数据字典将语句中的”*”转换成emp表中的所有列名,然后在执行与第二条语句同样的查询操作,这自然要比直接使用列名话费更多的时间。 如果再次执行这两条语句,会发现执行时间减少。这是因为所执行的语句被暂时保存在共享池中,Oracle会重用已解析过的语句的执行计划和优化方案,因此执行时间也就减少了。 在SELECT语句中,使用WHERE子句过滤行,使用HAVING子句过滤分组,也就是在行分组之后才执行过滤。因为行被分组需要一定的时间,所以应该尽量使用WHERE子句过滤行,减少分组的行数,也就减少了分组时间,从而提高了语句的执行效率。 对scott用户的emp表进行操作,根据deptno列进行分组,并使用HAVING子句过滤deptno列的值为10的记录信息。具体如下: SQLSELECT deptno , avg(sal) FROM scott.emp GROUP BY deptno HAVING deptno 10; 已用时间: 00:00:00.05 以WHERE子句来代替HAVING子句的使用,可以实现同样的结果,但是执行时间却较少,如下: SQLSELECT deptno , avg(sal) , FROM scott.emp WHERE deptno 10 GROUP BY deptno ; 已用时间: 00:00:00.01 虽然WHERE子句与HAVING子句都可以用来过滤数据行,但HAVING子句会在检索出所有记录后才对结果集进行过滤;而使用WHERE子句就会减少这方面的开销。因此,一般的过滤条件应该尽量让WHERE子句实现。 HAVING子句一般用于对一些集合函数执行结果的过滤,如COUNT()、AVG()等。除此之外,一般的检索条件应该写在WHERE子句中。 删除表中的数据可以使用DELETE语句,也可以使用TRUNCATE语句。 其中,使用DELETE语句删除表中所有的数据时,Oracle会对数据逐行删除,并且使用回滚段来记录删除操作,如果用户在没有使用COMMIT提交之前使用ROLLBACK命令进行回滚操作看,则Oracle会将表中的数据恢

您可能关注的文档

文档评论(0)

wangz118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档