现在的位置: 首页 > 综合 > 正文

SQL 语句优化小结 主要从效能方面考虑。append模式修改

2013年06月04日 ⁄ 综合 ⁄ 共 893字 ⁄ 字号 评论关闭

复杂的sql,有点功底的编程人员都可以写出来。但是性能对sql功底能力要求更高。

下面是在实际工作中遇到问题的一些小结。

1:会影响索引的写法

ORACLE使用了一个复杂的自平衡B-tree结构支持索引,它的好处在于提高查询效率。但是也会带来额外的开销,详如下:

索引需要空间来存储,每当索引列被修改(所有的DML操作),索引将被修改,增加很多io操作。

A)索引列作为查询条件不可用NOT关键字,否则停止索引转向全表扫描;

B)索引列作为查询条件在WHERE语句中不可用计算,否则停止索引转向全表扫描;

比如 比较!= 字符串相加||、数学计算等;

C)多个索引列作为查询条件OR查询,改写成UNION写法(OR所有的列都有索引,否则还是老老实实用OR);而且用OR查询后,索引停止开始走全表扫描;

D)如果索引建立在多个列上面,那么只有第一个列被where引用,才会走索引。否则走全表扫描

记住一条规则,查询结果占所有记录的比例越小,使用索引效率越高。

 

2:SQL语句语法规则规范

2.1:sql关键字全部大写,除之外的表名和字段全小写(Oracle在执行前会先将sql语句转成大写)

2.2:禁止用*,关联查询时所有表要有别名,结果字段为”别名.字段“

2.3:在where条件块中,过滤掉最多的条件放在最末尾

 

 

3:替代法则,提高性能

3.1:使用Decode,替换掉case when语句块

3.2:使用truncate,替换掉delete。truncate是DDL语句,无需commit。如truncate table lianghao_rank

3.3:on,where,having它们按照这个顺序执行,所以在使用过程,能最先过滤的条件写在最前面执行的条件语句下

3.4:in和not in,它们的效率相对比较低

        可以考虑用exists和not exists替换

       select * from lianghao_user u where exists (select 1 from lianghao_policy p where p.u_id=u.user_id) ;

3.5 使用exists替换distinct

 

 

 

 

 

 

 

 

抱歉!评论已关闭.