select * from emp where ename like '%zhang%' 
select * from emp where ename like 'zhang%'
select * from emp where ename like '%zhang'这三条sql查询那一条索引有效,高手解释下,在线等回复!!

解决方案 »

  1.   

    一般来讲是第2条会走索引,但是通配符放在后面也不一定就能走索引,因为这时对索引是一个范围扫描,如果oracle通过统计数据认为这个范围比较大,那么走索引得到的代价评估值就更大,这时就不会选择走索引。如果通配符放在前面,oracle几乎可以肯定是不会选择走索引的(除非oracle确定该sql只需要访问该索引而不需要访问表)。因为这时必须是索引全扫描,而全扫描索引本身就会消耗大量资源,然后再根据得出的rowid(很有可能也很多)去扫描表又要消耗大量资源,这个查询总共消耗的资源很可能会比直接扫描全表慢很多。如果你认为自己比oracle更了解自己的查询语句和数据分布情况,你确定更多情况走索引是正确的,那就使用hint强制要求走索引。
      

  2.   

    如果对ename列建立索引,则都有效的,索引有无效,并不是根据你列值的取法,而是依据你取的列,只是查询效率上的区别而已
      

  3.   

    楼上的两位谢谢,ename 是索引列 根据两位的回答 又让我模糊了
      

  4.   

    不知道是不是这个意思。常理说是2可能走索引。但具体走不走还要通过oracle进行日志计划的比较决定。因为并不是所有情况下用索引比不用索引快。