Oracle高效SQL语句原则
http://blog.csdn.net/plainfield/archive/2006/11/02/1363058.aspx
良好的SQL语句风格易于发现问题、易于阅读,移植性好。80%的性能问题是由不良SQL语句引发的。
1.尽可能对查询条件的列建立索引;
2.尽量不要在where条件中对查询列使用函数,除非建立了相应的函数索引,如可用带前导字符的like代替substr;
3.任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的;
4.对于有联接的列,即使最后的联接值为一个静态值,优化器是不会使用索引的;
5.通配符(%)在搜寻词首出现,所以Oracle系统不使用索引;
6.任何在Order by语句的非索引项或者有计算表达式都将降低查询速度;
7.如果要使用NOT,则应在取反的短语前面加上括号,并在短语前面加上NOT运算符,用NOT就不能用索引,尽量用“< or >”代替“<>”;
8.IN和EXISTS,绝大多数情况下EXISTS比IN性能高,加上NOT也一样;
9.Where子句中要将值和列的类型匹配,如数字和字符间,否则将导致全表扫描;
10.不要在应用程序中使用关联子查询,可使用联机视图来代替;
11.对于带有很多OR的非常复杂查询,可以考虑用union all来重写;
12.可批量完成的操作不应该由循环方式来进行;
13.用格式一致的SQL语句,包括字母的大小写、标点符号、换行的位置等都要一致,以减少SQL分析编译开销;
14.游标、动态SQL语句尽量用绑定变量方式调用,以减少SQL分析编译开销;
15.在可能产生异常的地方用异常处理;
16.把一些常用功能模块用函数或存储过程封装;
Oracle索引创建原则
以前做的Oracle培训资料,整理的创建索引的几条原则:
1.需要平衡query合DML的需要,常用于(子)查询的表应建立索引;
2.把索引建到不同的表空间中;
3.用统一的extent大小: 五个block的倍数或者tablespace指定的MINIMUM EXTENT的倍数;
4.创建索引考虑用NOLOGGING参数,重建索引的时候也一样;
5.创建索引时INITRANS值应该比相应的table的值高一些;
6.对常用SQL语句的where条件中的列建立唯一索引或组合索引,组合条件查询中相应的组合索引更有效;
7.对于组合索引,根据列的唯一值概率,安排索引顺序;
8.如果一个列具有很低的数据基数,并且或者可具有空值,不应作为索引列;
9.如果where语句中不得不对查询列采用函数查询,如upper函数,最好建立相应函数索引;
10.对于低基数集的列,并包含OR等逻辑运算,考虑用Bitmap索引,对于从大量行的表中返回大量的行时也可以考虑Bitmap索引;
11.避免在有大量并发DML运算的表中使用Bitmap索引;