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