Oracle中常用的查询优化方法.docVIP

  1. 1、本文档共9页,可阅读全部内容。
  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文档。上传文档
查看更多
Oracle中常用的查询优化方法   摘要:在数据库的使用过程中,查询是一个非常重要的部分,人们在使用SQL时往往太关注于所得到的结果是否正确,而忽略了不同的实现方法之间可能存在的性能差异,这种性能差异在大型或是复杂的数据库环境中表现得尤为明显。该文就常使用的查询优化方法进行阐述。   关键词:查询;优化Oracle   中图分类号:TP311文献标识码:A文章编号:1009-3044(2011)29-7095-03   SQL语句是对数据库(数据)进行操作的惟一途径;消耗了70%~90%的数据库资源;独立于程序设计逻辑。相对于对程序源代码的优化,对SQL语句的优化在时间成本和风险上的代价都很低。而在SQL语句中耗费时间较多的就是查询语句,查询处理的代价通常取决于磁盘访问,磁盘访问的速度比内存访问慢很多。对于一个给定的查询,通常会有多种写法,选择一种优化的方法可大幅度提高查询的效率。下面就常用的查询优化方法进行阐述。   1 书写习惯   为了不重复解析相同的SQL语句,在第一次解析之后,Oracle将SQL语句存放在内存中。这块位于系统全局区域SGA(System Global Area)的共享池中的内存可以被所有的数据库用户共享。 因此,当你执行一个SQL语句时,如果它和之前的执行过的语句完全相同,Oracle就能很快获得已经被解析的语句以及最好的执行路径。大大地提高了SQL的执行性能并节省了内存的使用。但只对简单的表提供高速缓冲(cache buffering),这个功能并不适用于多表连接查询。   因此写SQL语句时,应保持固定的SQL书写习惯,相同的查询尽量保持相同的形式,包括字母的大小写、标点符号、换行的位置等。   使用动态SQL列引用*是一个方便的方法,但这是一个非常低效的方法。Oracle在解析的过程中, 会将*依次转换成所有的列名, 这个工作是通过Oracle多表查询数据字典完成的, 这将耗费更多的时间。   2 常量优化   常量的计算并不是每次执行之时,而是在语句被优化时一次性完成。下面是检索年薪大于36000的方法:1)sal 3000*122)sal 360003)sal/12 3000   如果是第一种情况,优化器会简单地把它转变成第二种。而第三条语句会对每一行进行计算。因此,尽量不要将字段置于表达式当中,否则没有办法优化。尤其当sal上有索引时,第三种方式将进行全表扫描。   3 操作符优化   3.1 IN 操作符优化   在值不多的情况下,尽量使用“=”和“OR”来替换IN。如,可把表达式ename IN (FORD,KING,JONES)替换为ename = FORD OR ename = KING OR ename = JONES。   对于连续的数值,能用 BETWEEN就不要用IN。如age IN(20,21,22,23,24),可使用BETWEEN 20 AND 24来替代。   当子查询使用IN时,为了提高效率,可以使用EXISTS来替代,如图1(a)(b)所示。(a)所在子查询中进行了全表扫描,而(b)进行的是部分扫描。几乎所有的IN操作符子查询都可以改写为使用EXISTS的子查询。在执行IN子查询时,首先执行子查询,将查询结果放入临时表再执行主查询,而EXIST则是首先检查主查询,然后运行子查询直到找到第一个匹配项。但具体在选择IN或EXIST操作时,要根据主子表数据量大小来具体考虑。也不建议使用NOT IN,因为其不能应用表索引,可以使用NOT EXISTS代替。   3.2 ANY和ALL 操作符优化   可将跟随值列表的ANY检索条件用等价的同等操作符和“OR”组成的表达式替换。如sal ANY (1000, 2000)可替换为sal 1000 OR sal 2000。   可将跟随子查询的ANY检索条件转换成由“EXISTS”和一个相应的子查询组成的检索表达式。如x ANY (SELECT sal FROM emp WHERE job = ANALYST)可替换为 EXISTS (SELECT sal FROM emp WHERE job = ANALYST AND x sal)。   可将跟随值列表的ALL操作符用等价的“=”和“AND”组成的表达式替换如sal ALL (l000, 2000)表达式会被替换为sal1000 AND sal2000。   对于跟随子查询的ALL表达式,可使用ANY和另外一个合适的比较符组成的表达式替   换。如 xALL (SELECT sal FROM emp WHERE deptno = 10)可替换为NOT (x = ANY (SELECT sal FROM emp

文档评论(0)

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

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

版权声明书
用户编号:5243141323000000

1亿VIP精品文档

相关文档