索引使用及索引失效总结

来源:互联网 发布:java疯狂讲义第三版 编辑:程序博客网 时间:2024/06/05 08:41
1.在索引列上使用函数。比如substr,decode,instr等,对索引列进行计算。需要建立函数索引就可以了。
  如:select * from staff where trunc(birthdate)='01-MAY-82'。---失效
  select * from staff where birthday < (to_date('01-MAY-82') + 0.9999)。
  注意,对于MAX,MIN函数,Oracle仍然使用索引。
2.新建的表还没来得及生成统计信息,分析一下就好了。
3.基于cost的成本分析,访问的表过小,使用全表扫描的消耗小于使用索引。
4.使用<>、not in、not exist,对于这三种情况。大多数情况下认为结果集很大,一般大于5%-15%就不走索引而直接走FTS。
5.单独的>、<。
6.like "%_"百分号在前。
7.单独引用复合索引里非第一位置的索引。
8.字符型字段为数字时在where条件里不加引号。
  如:dept_id是一个varchar2型的字段,在这个字段上有索引。
  select * from dept where dept_id = 1234---索引失效。这是因为oracle会自动把where子句装换成to_number(dept_id)=1234,
  相当于使用函数。这样就限制了索引的使用。正确的使用方式是:select * from dept where dept_id = '1234'。
9.当变量采用的是times变量,而表的字段采用的是date变量时,或相反情况。
10.索引失效,可以考虑重建索引。
11.B-tree索引is null不会走,is not null会走;位图索引is null,is not null都会走;
   联合索引is not null只要在建立的索引列(不分先后)都会走。
12.没有where子句。
13.where子句中使用不等于操作
   不等于操作包括:<>,!=。对于这个限制条件可以通过OR代替,例如;column<>0 ===> column > 0 OR column < 0
14.等于和返回索引同时出现在where子句中,并不会合并使用。
   select emp_id,emp_m,salary_q from emp where job = 'manager' and deptno > 10.
   job和deptno都是非唯一索引,这种条件下oracle不会合并索引,它只会使用第一个索引。
15.如果条件中带有or,即使其中条件带有索引也不会使用(这也是为什么尽量少用or的原因)。要想使用or,又想让索引生效,需要
   在or条件中的每一列上都加上索引。
0 0
原创粉丝点击