Oracle 提高查询性能(基础)

jopen 10年前

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

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

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

#3,  减少数据库访问的次数

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

  2. 见,减少访问数据库的次数,实际上是降低了数据库系统开销

#4, 用Where子句替换HAVING

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