有一个表发现查询慢了,用执行计划分析,发现是全表扫描的原因,忘加索引了.
加上索引之后,用执行计划分析,仍然是全表扫描(TABLE ACCESS FULL),不是用索引扫.这是为什么了.

解决方案 »

  1.   

    強制索引? /*+ INDEX (TB_NAME INDEX_NAME)
    還是查詢條件裏使用了 索引KEY?你寫的語句有問題吧
      

  2.   

    有些限制条件,即使你强制使用索引,实际上也是full index scan。
    所以还是把你建立了什么索引,以及查询的SQL贴出来吧。
      

  3.   

    b-tree索引
    全表大概有40多万条数据.
      

  4.   

    sql语句没写好也会导致索引用不上
      

  5.   

    google一下,什么情况下不会使用index, 答案一大堆
      

  6.   

    检查下看是否由于SQL语句本身导致没有走索引.如下几条,仅作参考。
    1、除非必要,否则不要在where子句中的“=”左边进行函数、算术运算或其他表达式运算:WHERE子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描。
    2、避免在索引列上使用IS NULL 和IS NOT NULL:避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引 .对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录.如果至少有一个列不为空,则记录存在于索引中
    3、尽量避免在索引列上使用NOT:NOT会产生和在索引列上使用函数相同的影响. 当ORACLE遇到“NOT”,他就会停止使用索引转而执行全表扫描。
    5、总是使用索引的第一个列:如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引. 这也是一条简单而重要的规则,当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引 。
    6、避免改变索引列的类型:当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换。例如,当某个列opcode类型为char(4)时,条件 where opcode = 30将被oracle解释为 where to_number(opcode) = 30,这样隐式的类型转换也将导致不走索引而执行全表扫描。
    7、除非必要,否则不要让通配符(%)在搜寻词首出现:例如,要求在职工表中查询名字中包含cliton的人。可以采用如下的查询SQL语句:select * from employee where last_name like '%cliton%'; 这里由于通配符(%)在搜寻词首出现,所以Oracle系统不使用last_name的索引。在很多情况下可能无法避免这种情况,但是一定要心中有底,通配符如此使用会降低查询速度。然而当通配符出现在字符串其他位置时,优化器就能利用索引。在下面的查询中索引得到了使用:  select * from employee where last_name like 'c%'。
      

  7.   

    应该是你SQL语句的缘故吧。8楼写的很全
      

  8.   

    没有包含8楼所说的情况。
    如果用< >的可以吗?