Oracle 提升查询性能(基础)

#1,选择最有效的表名顺序数据库

 Oracle解析器老是按照从右至左的顺序处理FROM后面的表,所以FROM最右边的表将会被当作驱动表优先处理,当存在多个表关联时,应当使用记录少的表当作驱动表。若是关联的表多的话,则用交叉表做为驱动表。优化

#2,select中避免使用'*'.排序

#3,  减小数据库访问的次数索引

  1. 每当执行一条SQL语句,Oracle 须要完成大量的内部操做,象解析SQL语句,估算索引的利用率,绑定变量, 读数据块等等.由此可       效率

  2. 见,减小访问数据库的次数,其实是下降了数据库系统开销
    变量

#4, 用Where子句替换HAVINGselect

  1. -->尽量的避免having子句,由于HAVING 子句是对检索出全部记录以后再对结果集进行过滤。这个处理须要排序,总计等操做                 统计

  2. -->经过WHERE子句则在分组以前便可过滤没必要要的记录数目,从而减小聚合的开销 。数据

#5,使用 UNION ALL 替换 UNION(若是有可能的话)                                                           查询

  1. 当SQL语句须要UNION两个查询结果集时,这两个结果集合会以UNION-ALL的方式被合并, 而后在输出最终结果前进行排序。       

  2. 若是用UNION ALL替代UNION, 这样排序就不是必要了。 效率就会所以获得提升。                                                                            

  3. 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,可是不显示查询输出

相关文章
相关标签/搜索