前段时间参加了淘宝的面试,面试官问我有没有碰到过Oracle索引走错的问题。当时想索引还会走错。我是没有碰到过这样的情况,不知有哪位大牛碰到过。有的话说下原因咯

解决方案 »

  1.   

    不知道是不是指不走索引
    建立了索引,在查询语句中使用了索引字段 但是不走索引的可能:1、建立组合索引,但查询谓词并未使用组合索引的第一列,此处有一个INDEX SKIP SCAN概念。 
    2、在包含有null值的table列上建立索引,当时使用select count(*) from table时不会使用索引。 
    3、在索引列上使用函数时不会使用索引,如果一定要使用索引只能建立函数索引。 
    4、当被索引的列进行隐式的类型转换时不会使用索引。如:select * from t where indexed_column = 5,而indexed_column列建立索引但类型是字符型,这时Oracle会产生 
    隐式的类型转换,转换后的语句类似于select * from t where to_number(indexed_column) = 5,此时不走索引的情况类似于case3。日期转换也有类似问题,如: 
    select * from t where trunc(date_col) = trunc(sysdate)其中date_col为索引列,这样写不会走索引,可改写成select * from t where date_col >= trunc(sysdate) 
    and date_col < trunc(sysdate+1),此查询会走索引。 
    5、并不是所有情况使用索引都会加快查询速度,full scan table 有时会更快,尤其是当查询的数据量占整个表的比重较大时,因为full scan table采用的是多块读, 
    当Oracle优化器没有选择使用索引时不要立即强制使用,要充分证明使用索引确实查询更快时再使用强制索引。 6、<> 7、like’%dd’百分号在前 8、not in ,not exist. 
      

  2.   

    我估计面试官是想说在CBO的情况下,某些时候优化器选择的索引并不是最佳路径,导致性能低下,有很多原因导致这种情况,常见的有:
    1.数据分布不均匀,需要收集直方图给CBO做进一步参考
    2.SQL较复杂,连接的表太多(比如10个以上),CBO无法列举所有连接路径并比较开销。这种情况最好手动添加hint指定驱动表或者索引。
      

  3.   

    隨著數據的增加,索引的效率可能會下降,這時Oracle可能就不會走索引,需要重建索引
      

  4.   

    索引会经常走错
    1,糟糕的编写习惯;
    2,cbo环境下的统计信息过旧;
    3,没有正确的索引;
    4,db_file_mulity_block_read_count设置问题
    等等。