1. 使用 insert、select必须给出字段列表

    因为使用*代替所有的字段后,如果表结构发生变化,应用程序可能出现无法识别的情况。比如java的Struts2+spring+ibatis框架,sql语句在XML档配置,内容:

<select id="id" parameterClass="java.util.HashMap" resultClass="TableClass">

      select * from t;

</select>

这个配置需要TableClass的属性与table的栏位完全相同(包括大小写),如果表结构变更,但是TableClass类没有同步的话,这个查询将出错。

2. 同一SQL必须完全相同

    原因是在Oracle完全一样SQL语句可以实现共享,完全是指大小写、空格位置都必须一致。

3. 避免隐形转换

   select field1,field2

        from t

   where param = to_nchar(:param)

   栏位param与参数param类型不一致时发生类型转换,这可能导致性能问题。

4. 避免大小写转换 (与5类似)

5. 避免对(索引)栏位使用函数

比如很多场景需要使用日期查询

select *

   from t

where to_char(date, ‘yyyy/mm/dd’) BETWEEN ‘1999/01/01’ AND ‘2012/10/16’

6. 避免使用前置的Like(%abc)模糊查询

    这将导致全表扫描,建议使用后置Like(abc%)模糊查询,或者搜索引擎。

7. 当list大于20时,不要使用In list

a in (:1,:2,:3,…,:n) --- n > 20

8. 避免使用!=或<>操作符,这将导致全表扫描

9. 避免在where子句中对字段进行函数操作,这将导致全表扫描

select id from t where substring(name,1,3)='abc'; --name以abc开头的id

10. 避免在where子句中的”=”左边进行函数、算术运算或其他表达式运算,否则将无法正确使用索引。

11. 避免在where子句中对字段进行null值判断。

select id from t where num is null;

这将导致全表扫描