1、选择最有效率的表明顺序
Oracle采用从右往左的顺序解析from子句中的表名,写在from子句后面的表将被优先处理。
2、where子句的链接顺序
Oracle采用自下而上的顺序解析where子句,所以表之间的链接要写在where之前,能过滤掉大量记录的条件写在where的末尾。
3、select语句避免使用*
解析过程中会将*先转换成所有的列名,通过查询数据字典完成,非常耗时。
4、使用DECODE函数减少处理时间
这个函数可以避免重复扫描相同记录或者重复连接相同的表。
5、删除重复记录的最高效率语句
DELETE FROM gcfr_t_vch E WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM gcfr_t_vch X WHERE X.type = E.type);
删除全表记录时使用truncate代替delete可以提高效率,不回滚。
6、避免使用having
Having只会在检索出所有记录之后再进行过滤,这个处理需要排序,总计等操作,耗时。尽量使用oracle内部函数来提高效率。
7、使用exists代替in,not exists代替not in
In语句内部执行了排序,合并,对字表进行全表遍历,耗时。
8、使用索引
避免在索引列上使用not,遇到not就会停止使用索引而进行全表扫描。
如果where子句中,索引列是函数的一部分,优化器将不使用索引。
9、使用 >= 代替 >
Select vchno from gcfr_t_vch where vchno >= 4;(高效率)
Select vchno from gcfr_t_vch where vchno >3;(低效率)
第一个语句dbms将直接跳到vchno=4的记录。后者是跳到等于3的记录,然后扫描大于3的记录。
10、使用union代替or(使用与索引列)
索引列遇到or将停止使用索引对全表扫描。
11、避免使用is null is not null
停止使用索引
12、避免改变索引列的类型
当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换.
假设 EMPNO是一个数值类型的索引列.
SELECT … FROM EMP WHERE EMPNO = ‘123'
实际上,经过ORACLE类型转换, 语句转化为:
SELECT … FROM EMP WHERE EMPNO = TO_NUMBER(‘123')
幸运的是,类型转换没有发生在索引列上,索引的用途没有被改变.
现在,假设EMP_TYPE是一个字符类型的索引列.
SELECT … FROM EMP WHERE EMP_TYPE = 123
这个语句被ORACLE转换为:
SELECT … FROM EMP WHERETO_NUMBER(EMP_TYPE)=123
因为内部发生的类型转换, 这个索引将不会被用到! 为了避免ORACLE对你的SQL进行隐式的类型转换, 最好把类型转换用显式表现出来. 注意当字符和数值比较时, ORACLE会优先转换数值类型到字符类型。
13、优化group by
在group by之前将不需要的记录过滤掉,提高效率。
--低效率 select job,avg(sal) from emp group by job having job = '1' or job = '2'; --高效率 select job,avg(sal) from emp where job = '1' or job = '2' group by job;