SQL Tuning(10g)
1. 使用AND和=来构造谓语
为了提高SQL的执行效率,在任何可能的时候使用等值连接
2.避免改变WHERE子句中的列
在索引列上使用表达式(包括函数),将会导致优化器忽略该列上的索引,除非该列上定义的为基于函数的索引,所以应该将函数写在相对的位置上
e.empno为数值索引列
select * from emp e where e.empno=1001;使用索引
select * from emp e where e.empno=to_number('1001');使用索引
select * from emp e where e.empno||''=1001;不使用索引
select * from emp e where to_char(e.empno)='1001';不使用索引
还需要注意,当右端函数中出现列名时(不管是否为索引列),索引同样会失效:
e.ename为字符索引列
select * from emp e where e.ename=nvl('test',e.ename);不使用索引
select * from emp where ename=nvl('test','111');使用索引
要小心隐式的类型转换:
select * from emp e where e.ename=123;
下面是执行计划下的谓词信息:
1 - filter(TO_NUMBER("E"."ENAME")=123)
可以看出oralce会隐式的将列转换为数值类型,这时候索引失效,无论何时应该显示的进行类型转换来防止此种情况的发生
3.自己的总结
1.禁止对列的操作,如果对列进行操作,不仅不会使用索引,还会增加不必要的开销,这个开销在很多时候对性能影响很大
2.如何要建立索引,在数据选择性高的列上建立索引是一个指导。
3.优化思路:减少对远端对象的访问,将单条操作转化为批量操作,尽量减少交互数等 (PL/SQL)