在Oracle中,SQL如何优化?SQL优化的关注点有哪些?
随着数据库中数据量的增长,系统的响应速度就成为目前系统需要解决的最主要的问题之一。系统优化中一个很重要的方面就是SQL语句的优化。对于大量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上千倍。对于一个系统不是简单地能实现其功能就可以了,而是要写出高质量的SQL语句,提高系统的可用性。
在多数情况下,Oracle使用索引来更快地遍历表,优化器主要根据定义的索引来提高性能。如果在SQL语句的WHERE子句中写的SQL条件不合理,那么就会造成优化器舍去索引而使用全表扫描,一般这种SQL语句的性能都是非常差的。在编写SQL语句时,应清楚优化器根据何种原则来使用索引,这有助于写出高性能的SQL语句。
SQL的优化主要涉及如下几个方面的内容:
(1)索引问题。是否可以使用组合索引;限制条件、连接条件的列是否有索引;能否使用到索引,避免全表扫描。一般情况下,尽量使用索引,因为索引在很多情况下可以提高查询效率。排序字段有正确的索引,驱动表的限制条件有索引,被驱动表的连接条件有索引。
(2)相关的统计信息缺失或者不准确。查看SQL的执行计划是不是最优,然后结合统计信息查看执行计划是否正确。
(3)直方图使用错误,参考【3.2.6.6 什么是直方图(Histogram)?】。
(4)SQL本身的效率问题,例如使用绑定变量,批量DML采用BULK等,这个就考验写SQL的基本功了。
(5)数据量大小。如果就是几百条数据,那么就没有所谓效率之分,一般情况下怎么写效率都不低。如果数据量很大,那么就得考虑是否要分页或排序。
(6)绑定变量:大多数情况绑定变量能提高查询效率,但也有降低效率的情况。
(7)批量和并行的考虑。
(8)业务需求需要正确理解,实现业务的逻辑需要正确,减少一些重复计算。有可能是设计的不合理、业务需求的不合理,而问题SQL并非根本原因。
(9)查询特别频繁的结果是否可以缓存,比如Oracle的/*+ result_cache */。
(10)分析表的连接方式。若是NL连接,则根据业务或表的数据质量情况,分析能否减少驱动表的结果集。
(11)是否可以固定执行计划。
(12)大表是否存在高水位。
(13)在创建表的时候,应尽量建立主键,可以根据实际需要调整数据表的PCTFREE参数。
SQL优化的一般性原则如下所示:
l 目标:
减少服务器的资源消耗(主要是磁盘I/O)。
l 设计方面:
① 尽量依赖Oracle的优化器,并为其提供条件。
② 建立合适的索引,注意索引的双重效应,还有列的选择性。
l 编码方面:
参考【1.2.5.2 SQL优化在写法上有哪些常用的方法?】。
本文选自《Oracle程序员面试笔试宝典》,作者:李华荣。

---------------优质麦课------------
详细内容可以添加麦老师微信或QQ私聊。
● 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用
● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/
● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解
● 版权所有,欢迎分享本文,转载请保留出处
● QQ:646634621 QQ群:618766405
● 提供OCP、OCM和高可用部分最实用的技能培训
● 题目解答若有不当之处,还望各位朋友批评指正,共同进步
长按下图识别二维码或微信扫描下图二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,学习最实用的数据库技术。
