- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Oracle数据库SQL语句的性能优化.doc
Oracle数据库SQL语句的性能优化
SQL语句优化就是把性能低的SQL语句转换成达到同样目的的性能高的SQL语句。Oracle数据库的性能最终是由SQL语句的执行效率来决定。本文介绍了SQL优化的一般原则,并详细阐述了SQL语句性能优化的方法以及通过工具跟踪PL/SQL执行计划的方法达到优化SQL语句的目的。
【关键词】SQL PL/SQL 性能 优化 方法
1 SQL语句优化的一般原则
Oracle为了执行每条SQL语句,首先要对该条语句确定系统实际执行SQL语句的方法。根据统计约80%的数据库性能问题都是由执行效率低的SQL语句引起的,因此不管是软件开发人员还是数据库管理人员要编写高质量的SQL语句都要知道SQL优化的一般原则:
(1)减少服务器资源的消耗;
(2)尽量依靠oracle的优化器,并为其提供条件;
(3)合理使用和优化索引;
(4)合理应用临时表;
(5)避免写过于复杂的SQL语句,尽量少使用嵌套语句,嵌套查询会消耗大量的CPU资源;
(6)在不影响业务的前提下减少事务的粒度;
(7)在创建表的时候,应尽量创建主键,尽量根据实际应用的需要来调整表的PCTFREE和PCTUSED的存储参数,优化插入,修改或删除等操作;
(8)写 SQL语句时尽量用大写。
2 SQL语句优化的方法
2.1 Select 语句中尽量避免使用*
Oracle在解析使用带有“*”的select查询语句的过程中,需要到oracle的数据字典中去把“*”分别转换成所有对应的列名,这个解析的过程需要花费时间,因此降低了SQL语句的执行效率。
2.2 使用Where字句代替Having子句
在使用select 语句时,可以通过使用where字句来过滤行,having 子句过滤分组。Having 过滤分组是在分组后才执行,所以是要花费一定的时间。所以尽量使用where字句来过滤行,这样可以减少分组的行数,也就是减少分组的时间,提高了执行效率。
2.3 使用表连接而不是多个查询
Oracle在执行每条语句时,在其内部完成很多工作,如解析SQL语句、估算索引的利用率、绑定变量以及读取相关的数据块等,这样的话就需要花费很多时间。因此,查询结果的时候尽量使用一次查询获得数据,不要经过两次或多次查询。
2.4 选择最有效的表名顺序
Select语句中的from子句后面可以接多张表,选择哪张表放在最前面会影响到查询的效率。因为在Oracle解析器中解析查询语句时是按照从右往左的顺序处理from子句中的表名,也就是放在from子句最后面的表是最先被执行的。所以在from后面进行多张表连接的时候,通常把记录比较少的那张表作为基础表,把基础表放在最后面即最右边。当oracle在处理from后面的表的时候,首先是扫描from最后面的那张表,也就是记录比较少的那张表,这样先执行记录比较少的那张表就大大缩短了执行的时间。
2.5 where子句中的连接顺序
带有WHERE子句的查询中,where子句后面可以带多个条件。oracle在处理where子句后面的条件时是采用自右至左的顺序,因此,在RBO优化器模式下,如果有多张表的连接,应该按照表中的数据量从大到小顺序排列,然后按照数据量从左往右进行排列,这样在进行表连接时,最右边的表循环次数就会越少,执行的效率就会比较高。
2.6 用TRUNCATE代替DELETE删除表数据
删除表中的数据既可以使用delete语句也可以使用truncate语句。使用delete语句删除数据时,数据被存放在回滚段中。如果没有commit事务,oracle会将数据恢复到删除之前的状态。而使truncate语句用删除数据时,回滚段不再存放任何可被恢复的信息,数据不能被恢复。因此很少的资源被调用,这样的执行的时间也就变短了。
2.7 尽量多使用COMMIT
当用户执行DML操作后,如果不使用commit命令进行提交操作,则oracle会在回滚段中记录DML操作,以便用户使用rollback命令对数据进行恢复。在使用rollback命令恢复时需要花费系统相应的时间和资源。所以,在程序中尽量多使用commit命令,这样程序的性能会得到一定的提高,系统也会因为使用commit命令释放如回滚段上用于恢复数据的信息、被程序语句获得的锁等资源而提高性能。
2.8 使用EXISTS代替IN
EXISTS只判断子查询返回行的存在行,而IN操作符是用于检查一个值是否包含在列表中。使用IN操作符需要消耗更多的执行时间。
2.9 有效使用索引
Oracle 访问表中的记录
文档评论(0)