SQL语句性能优化

1.不要使用in或者not in。因为这样什么使索引失效。

  解决办法:使用exists和not exists来代替。

select * from student in ( select sid from sc)  
替换为
select sid from student s1 where not EXISTS(select sid from sc where s1.sid=sc.sid );

2.在使用where 判断的时候不要使用%开头,会让索引失效。

select * from student where sName like "%%";
替换为
select * from student where sName like "张%";

用YW_YHJBQK表中营业编号后面的户标识号可来查询营业编号 YY_BH LIKE ‘%5400%’ 这个条件会产生全表扫描,如果改成YY_BH LIKE ’X5400%’ OR YY_BH LIKE ’B5400%’ 则会利用YY_BH的索引进行两个范围的查询,性能肯定大大提高。

3.不要使用is null  或者is not null。

判断是否为空,一般不会引用索引的,因为索引是不引用空值的。 

如果是整型 可以判断是否>0   或者判断   >'' 空串等等。   或者设置数据库的时候设置为非空,加上一个缺省值 。

4.如果进行多条件判断的话,where 后面的条件的顺序也会对数据库的效率有很大的影响。

比如说:有一个用户表,里面有一百条记录,用户性别 和用户角色来查询用户的话,我们应该将角色的判断放在前面。   假设当这100条记录的符合某一个角色的时候,只有10条记录,而男女性别各一半的时候,这样我们只需要先对一百条记录判断一遍,得到10条记录,而从这10条记录中来判断是男或者女。这样只需要判断 110条记录。如果将性别放在前面的话,而会判断150条记录。 当然如果表中的男性用户特别少的话,应该先判断性别。

5.> 及 < 操作符(大于或小于操作符)

大于或小于操作符一般情况下是不用调整的,因为它有索引就会采用索引查找,但有的情况下可以对它进行优化,如一个表有100万记录,一个数值型字段A,30万记录的A=0,30万记录的A=1,39万记录的A=2,1万记录的A=3。那么执行A>2与A>=3的效果就有很大的区别了,因为A>2时ORACLE会先找出为2的记录索引再进行比较,而A>=3时ORACLE则直接找到=3的记录索引。

6.sql语句的书写也会有很影响。

如一个SQL在A程序员写的为  Select * from zl_yhjbqk

B程序员写的为 Select * from dlyx.zl_yhjbqk(带表所有者的前缀)

C程序员写的为 Select * from DLYX.ZLYHJBQK(大写表名)

D程序员写的为 Select *  from DLYX.ZLYHJBQK(中间多了空格)

以上四个SQL在ORACLE分析整理之后产生的结果及执行的时间是一样的,但是从ORACLE共享内存SGA的原理,可以得出ORACLE对每个SQL 都会对其进行一次分析,并且占用共享内存,如果将SQL的字符串及格式写得完全相同,则ORACLE只会分析一次,共享内存也只会留下一次的分析结果,这不仅可以减少分析SQL的时间,而且可以减少共享内存重复的信息,ORACLE也可以准确统计SQL的执行频率。

7.避免在sql语句中使用函数,避句在sql语句中对索引列进行计算。这样都会使索引无效。

8、尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:

select id from t where num=10 or num=20

可以这样查询:

select id from t where num=10

union all

select id from t where num=20

 

posted @ 2017-03-22 21:37  沧海红心  阅读(137)  评论(0编辑  收藏  举报