SQL性能调优技巧

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聚合函数
 

猜你喜欢

转载自zzhonghe.iteye.com/blog/2024296