#1,选择最有效的表名顺序数据库
Oracle解析器老是按照从右至左的顺序处理FROM后面的表,所以FROM最右边的表将会被当作驱动表优先处理,当存在多个表关联时,应当使用记录少的表当作驱动表。若是关联的表多的话,则用交叉表做为驱动表。优化
#2,select中避免使用'*'.排序
#3, 减小数据库访问的次数索引
每当执行一条SQL语句,Oracle 须要完成大量的内部操做,象解析SQL语句,估算索引的利用率,绑定变量, 读数据块等等.由此可 效率
见,减小访问数据库的次数,其实是下降了数据库系统开销
变量
#4, 用Where子句替换HAVINGselect
-->尽量的避免having子句,由于HAVING 子句是对检索出全部记录以后再对结果集进行过滤。这个处理须要排序,总计等操做 统计
-->经过WHERE子句则在分组以前便可过滤没必要要的记录数目,从而减小聚合的开销 。数据
#5,使用 UNION ALL 替换 UNION(若是有可能的话) 查询
当SQL语句须要UNION两个查询结果集时,这两个结果集合会以UNION-ALL的方式被合并, 而后在输出最终结果前进行排序。
若是用UNION ALL替代UNION, 这样排序就不是必要了。 效率就会所以获得提升。
UNION ALL会输出全部的结果集,而UNION则过滤掉重复记录并对其进行排序.所以在使用时应考虑业务逻辑是否容许当前的结果集存在重复现象
#6, 有两个简单例子,以说明 “exists”和“in”的效率问题
1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;
T1数据量小而T2数据量很是大时,T1<<T2 时,1) 的查询效率高。
2) select * from T1 where T1.a in (select T2.a from T2) ;
T1数据量很是大而T2数据量小时,T1>>T2 时,2) 的查询效率高。
经过使用EXISTS,Oracle会首先检查主查询,而后运行子查询直到它找到第一个匹配项,这就节省了时间。Oracle在执行IN子查询时,首先执 行子查询,并将得到的结果列表存放在一个加了索引的临时表中。在执行子查询以前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中之后再执行主查 询。这也就是使用EXISTS比使用IN一般查询速度快的缘由。
#7, AUTOTRACE
SET AUTOTRACE OFF ---------------- 不生成AUTOTRACE 报告,这是缺省模式SET AUTOTRACE ON EXPLAIN ------ AUTOTRACE只显示优化器执行路径报告 SET AUTOTRACE ON STATISTICS -- 只显示执行统计信息SET AUTOTRACE ON ----------------- 包含执行计划和统计信息 SET AUTOTRACE TRACEONLY ------ 同set autotrace on,可是不显示查询输出