Data Model设计的Tip
?
1. 以三个范式为基础,业务的独立性和原子性拆分要合适,杜绝Key的冗余和不充分依赖
2. 对于有NULL值的时候,说明可以拆分为子类, 如果有互斥值,比如两个字段,如果A有值,那么B就不能有值
3. 隐藏的约束,某个Column为A值,那么另外一个Column就必须为B值,或者某个Column只能是1~20的值
4. 对于Boolean值,比如某个Flag Column, ?Y/N, 其实可以考虑用更有意义的值来替代,比如Complete Date. 当然如果处于性能考虑的话不在此列。
?
?
高效访问DB的Tip
?
1. ?java单独调用的语句,可以加上/**/Select ...的注释,方便在dbms_application_info中识别相应的语句
2. 减少于DB连接的次数,减少编译语句的次数, DB Pool, ?PreparedStatement
3. 从最终的查询目标出发,查找数据。而不是从过程出发,查找数据
4. 不要动态建立数据库对象,比如索引,临时表,中间表等,都是不可取的。用GTtable是非常好的选择。
5. 修改数据库表数据,尽量用1条SQL搞定一批,而不是打开游标,然后update. ?检索+处理+插入数据
6. 接近DB的核心来处理数据,速度越快,SQL>PLSQL>Java
7. 杜绝使用count(*),一定可以找得到替代的方式
8. 用NVL, NULLIF, Case When, Decode等语句来替代IF ELSE逻辑,处理速度要快些。
9. update + Case When, 可以合并多个update语句到1条里面
10. 慎用自定义的函数,特别是带有select语句的函数method,性能杀手,而且无法优化
11. where条件中用decode,一条语句查出多种记录。
12. 能不抛异常就别抛,不要在异常处理逻辑中加上业务
13. 基于源表对目标表做Insert,Update,Delete操作, 用Merge into...When Matched then Insert ...?
??????????http://www.cnblogs.com/lenxu/archive/2012/02/14/2350922.html
?
?
索引
?
1. 维护一个索引的开销,可能比一张表还要大,所以要精确设计索引,每个所以有是非常必须才添加
2. 如果一次获取的数据比较多,当超过表中数据总数的10%以上,那么是没有必要有索引,全表扫描可能更快
3. 索引指向的是某个数据块,而不是某条记录,所以紧凑的数据块结构能够获得更好的性能
4. 索引列上使用函数,会让索引失效,另外维护函数索引,成本会非常的高
5. 隐式的类型转换会让索引失效。 a=123 ?如果a是字符串,那么a上的索引会失效
6. 复合索引优于普通索引,1个索引可以适用多个场景使用,减少维护索引的数量
7. 逆序索引 Reverse Index,将key逆序后,再建索引,减少高并发的竞争资源,范围查询无效
8. 哈希索引,把key的值进行索引,提高并发性能,但是不能范围查。
?
?
SQL语句技巧
?
1. 关系操作有join, 非关系操作有group by, order by. 非关系操作需要临时的表空间进行存储
2. 单条数据查询响应时间要很快,努力让结果集和时间成正比
3. 复杂查询中尽量不用视图,可以会join到不需要的数据,不利于性能
4. exist用于子查询的情况是,父表数据少,子表数据多。in则是子表数据少,父表数据多的情况。 ?not exist和not in的场景与此类似
5. in的括号里面暗含了distinct和order by的操作,放置于内存。
6. Rank聚合函数
?
?