复杂的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