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;
这将导致全表扫描