当前位置:Gxlcms > 数据库问题 > sql优化

sql优化

时间:2021-07-01 10:21:17 帮助过:14人阅读

from子句中的表名,写在from子句后面的表将被优先处理。

2where子句的链接顺序

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代替innot 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;

 

 

 

sql优化

标签:decode   排序   顺序   不同   提高效率   相同   条件   ber   等于   

人气教程排行