转至http://blog.csdn.net/u012150457/article/details/41846299

一、编写高效SQL语句

1) 选择最有效的表名顺序(仅适用于RBO模式)

ORACLE的解析器总是按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中最后的一个表将作为驱动表被优先处理。当FROM子句存在多个表的时候,应当考虑将表上记录最少的那个表置于FROM的最右端作为基表。Oracle会首先扫描基表(FROM子句中最后的那个表)并对记录进行排序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表,交叉表是指那个被其他表所引用的表。

2) select 查询中避免使用'*'   

当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 '*' 是一个方便的方法.不幸的是,这是一个非常低效的方法.实际上,ORACLE在解析的过程中, 会将 '*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。

3) 减少访问数据库的次数

4) 使用DECODE函数来减少处理时间 

-->使用decode函数可以避免重复扫描相同的行或重复连接相同的表

select count(*),sum(sal) from emp where deptno=20 and ename like 'SMITH%';

select count(*),sum(sal) from emp where deptno=30 and ename like 'SMITH%';

-->通过使用decode函数一次扫描即可完成所有满足条件记录的处理

SELECT COUNT( DECODE( deptno, 20, 'x', NULL ) ) d20_count

, COUNT( DECODE( deptno, 30, 'x', NULL ) ) d30_count

, SUM( DECODE( deptno, 20, sal, NULL ) ) d20_sal

, SUM( DECODE( deptno, 30, sal, NULL ) ) d30_sal

FROM   emp

WHERE  ename LIKE 'SMITH%';

类似的,DECODE函数也可以运用于GROUP BY 和ORDER BY子句中。

5) 整合简单,无关联的数据库访问  

6) 删除重复记录 

-->通过使用rowid来作为过滤条件,性能高效  

7) 使用truncate 代替 delete  

8) 用Where子句替换HAVING子

  1. -->尽可能的避免having子句,因为HAVING 子句是对检索出所有记录之后再对结果集进行过滤。这个处理需要排序,总计等操作
  2. -->通过WHERE子句则在分组之前即可过滤不必要的记录数目,从而减少聚合的开销

9) 最小化表查询次数

-->在含有子查询的SQL语句中,要特别注意减少对表的查询

10) 使用表别名

-->在多表查询时,为所返回列使用表别名作为前缀以减少解析时间以及那些相同列歧义引起的语法错误

11) 用EXISTS替代IN   

在一些基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下,使用EXISTS(或NOT EXISTS)通常将提高查询的效率.

12) 用EXISTS替换DISTINCT 

二、合理使用索引以提高性能

05-11 14:05