ORACLE中SQL查询完整版.docx

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

ORACLE中SQL查询

摘要数据库性能问题一直是决策者及技术人员共同关注的焦点,影响数据库性能的一个重要因素就是SQL查询语句的低效率。论文首先分析了导致SQL查询语句性能低下的四个常见原因以及SQL调优的一般步骤,然后分别针对如何降低I/O操作、在查询语句中如何避免对查询结果的高成本操作以及在多表连接时如何提高查询效率进行了分析。

关键词ORACLE;SQL;优化;连接

1引言

随着网络应用不断发展,系统性能已越来越引起决策者的重视。影响系统性能的因素很多,低效的SQL语句就是其中一个不可忽视的重要原因。论文首先分析导致SQL性能低下的常见原因,然后分析SQL调优应遵循的一般步骤,最后从如何降低I/O、避免对查询结果的高成本操作和多表连接中如何提高SQL性能进行了研究。鉴于目前ORACLE在数据库市场上的主导地位,论文将只针对ORACLE进行讨论。

2影响SQL性能的原因

影响SQL性能的因素很多,如初始化参数设置不合理、导入了不准确的系统及模式统计数据从而影响优化程序的正确判断等,这些往往和DBA密切相关。纯粹从SQL语句出发,笔者认为影响SQL性能不外乎以下四个重要原因:

在大记录集上进行高成本操作,如使用了引起排序的谓词等。

过多的I/O操作,最典型的就是未建立恰当的索引,导致对查询表进行全表扫描。

处理了太多的无用记录,如在多表连接时过滤条件位置不当导致中间结果集包含了太多的无用记录。

未充分利用数据库提供的功能,如查询的并行化处理等。

第个原因处理起来相对简单。论文将针对前三个原因论述如何提高SQL查询语句的性能。

3SQL优化的一般步骤

SQL优化一般需经过发现问题、分析问题、提出解决措施、应用措施、测试性能几个步骤,如图1所示。“发现问题就是解决问题的一半”,因此在SQL调优过程中,定位问题SQL是非常重要的一步,一般可借助于ORACLE自带的性能优化工具如STATSPACK、TKPROF、AUTOTRACE等辅助用户进行,同时还应该重视动态性能视图如V$SQL、V$MYSTAT、V$SYSSTAT等的研究。

图1SQL优化的一般步骤

4SQL语句的优化优化排序操作

排序的成本十分高昂,当在查询语句中使用了引起结果集排序的谓词时,SQL性能必然受到影响。

排序过程分析

当待排序数据集不是太大时,服务器在内存完成排序操作,如果排序需要更多的内存空间,服务器将进行如下处理:

将数据分成多个小的集合,对每一集合进行排序。

服务器向磁盘申请临时空间,将排好序的中间结果写入临时段,再对另外的集合进行排序。

在所有的集合均排好序后,服务器再将它们进行合并得到最终的结果,如果排序区尺寸太小,合并无法一次完成时,将分多次进行。

从上述分析可知,排序是一种十分昂贵的操作,它消耗大量的CPU时间和内存,触发磁盘分页和交换操作,因此只要有可能,我们就应该在SQL语句中尽量避免排序操作。

中引起排序的操作

SQL查询语句中引起排序的操作大致有:ORDERBY和GROUPBY从句;DISTINCT修饰符;UNION、INTERSECT、MINUS集合操作符;多表连接时的排序合并连接等。

如何避免排序

1)建立恰当的索引

对经常进行排序和连接操作的字段建立索引。在建立索引后,当服务器向这些字段发出排序请求时,将直接引用索引而不进行排序操作;当进行等值连接查询操作时,若建立连接的字段未建立索引,服务器进行的是排序合并连接,连接操作的过程如下:

对进行连接的两个或多个表分别进行全扫描;

对每一个表中的行集分别进行全排序;

合并排序结果。

如果建立连接的字段已建立索引,服务器进行嵌套循环连接,该连接方式不需要任何排序,其过程如下:

对驱动表进行全表扫描;

对返回的每一行利用连接字段值实施索引惟一扫描;

利用从索引扫描中返回的ROWID值在从表中定位记录;

合并主、从表中的匹配记录。

因此,建立索引可避免多数排序操作。

2)用UNIIONALL替换UNION

UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。大部分应用中是不会产生重复记录的,最常见的是过程表与历史表UNION。因此,采用UNIONALL操作符替代UNION,因为UNIONALL操作只是简单的将两个结果合并后就返回。

优化I/O

过多的I/O操作会占用CPU时间、消耗大量内存和占用过多的栓锁,因此有必要对SQL的I/O进行优化。优化I/O的最有效方式就是用索引扫描代替全表扫描。

应用基于函数的索引

基于函数的索引提供了索引计算列并在查询中使用这些索

您可能关注的文档

文档评论(0)

133****5313 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档