会降低。因为索引是建立在字段的原来的值基础上的,比如按照字母顺序之类的,但如果
使用了函数,将大写改为小写,原来的排序就不成立了,所以此时无法利用索引,
同时like操作也很影响效率。

解决方案 »

  1.   

    如果是8i以后的oracle版本(oracle815以后的版本),则可以通过建立BFI(based function index)来达到既要用函数,又需要使用索引得需求。
    上面的like字句会使用索引,如果改成 like '%S',这样就不会使用index了。至于lower和trim,他们是不走索引的,因为index中存储的是rowid和key(键值,如你的add_name值),并没有存储经过函数运算的key值,因此导致了一个FULL TABLE SCAN,从而在多数情况下极大的损失了性能。
      

  2.   

    我建了BFI如下
    CREATE INDEX HM_BFI_IND_L_NAME ON INDIVIDUAL
    (
            lower(rtrim(ind_last_name))
    );
    可察看执行Plan,仍然是Full table scan,难道是我目前的Oracle版本不支持,但是检索引时,它提示:
    Index Created
    还需要有什么设置吗?
    谢谢
      

  3.   

    hi :
      UChuaihuai(huaihuai)  如果你要用BFI,记得要把query_rewrite_enable参数设为TRUE,  ALTER SET SYSTEM query_rewrite_enable=TRUE 
      然后你在执行plan看看,
      而我在pl/sql下看 用 rull,和choose时仍然是rall table scan,但是用 first row ,和all row 下提示可以用到索引,至于为基于rull时不能用,
    以及如何在脚本中选择索引的方式,还有其他涉及的方面,还不了解,
      共同学习。。呵呵
    ——————————————-------
                QQ: 6587168  希望能多交些这里的朋友;