java开发经验分享(二)
二、 数据库
1. SQL语句中保留字、函数名要大写,表明、字段名全部小写
如:SELECT vc_name,vc_sex,i_age FROM user WHERE i_id = 100 AND i_type = 2
2. 使用标准SQL语句,防止数据库兼容问题
3. 循环里面(包括循环调用方法内)避免过多操作数据库
4. 选择最有效率的表名顺序
ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表
5. 注意WHERE子句中的连接顺序
ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾
6. SELECT子句中避免使用*
ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间
7. 减少访问数据库的次数,尽量批量操作数据库,如批量删除
ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等
8. 避免在WHERE子句中使用in,not in,or 或者having
可以使用 exist 和not exist代替 in和not in
9. 用WHERE子句替换HAVING子句
避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销。
10. 用好数据库事务
事务是指作为单个逻辑工作单元执行的一系列操作。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。
Transaction ts = null;
try{
ts = new Transaction(appId);
…
…
boolean bl = ts.execute(sql);
if(bl){
bl = ts.commit();
}
if(!bl){
throw new Exception();
}
}catch(Exception e){
if(ts!=null)
ts.roolback();
bl = false;
}
11. 注意SQL执行效率,考虑单表记录10W以上的运行效果
setup中,日志显示级别为警告以上时,执行时间超过300ms的SQL语句,会在日志中输出warning
12. 索引
参考:数据库性能优化