以 scott 用户下的 dept 和 emp 两个表为例
Select * From 
    (Select * From dept Where deptno = '10') dept Left Join emp 
    On dept.deptno = emp.deptno如果在 emp.deptno 上创建了一般索引,则执行计划中发现对 emp 表根据索引扫描
而如果在 emp.deptno 创建位图索引,则对 emp 表进行全表扫描为什么会这样?

解决方案 »

  1.   

    oracle中建立了索引,但并不是说就一定会走这个索引,因为oracle在执行sql的时候有自己的优化方式,
    理论上是会根据最优化的方式来执行sql,比如一个表的数据量很小,那么全表扫描就能非常快的查询了,而如果走索引的话,说不定更费劲,索引就不会走索引了~这个在oracle中常用发生
      

  2.   

    根据你说的,优化器应该是基于开销的。
    看一下你sql的执行计划。
    再使用hint强制使用索引,看一下执行计划。
    两者比较一下。
    最后如果你觉得走索引的开销较小,那可能是因为表长时间没有收集统计信息。
    使用anlyze命令收集一下。
    再看一下normal状态下的sql语句执行计划。
    希望能够帮助到你。