t(
 a varchar(2048)
 )create index idx on t(trim(a));select * from t where trim(a) = 'test';explain plan 中就是TABLE ACCESS FULL。
 已经
set QUERY_REWRITE_ENABLED = TRUE
SET QUERY_REWRITE_INTEGRITY = TRUSTED加入hint
select /* + index (t, idx) */* from t where trim(a) = 'test';
结果还是一样

解决方案 »

  1.   

    使用函数索引前提:
    1,CBO
    2,analyze index
      

  2.   

    当然是ACCESS FULL了,因为它的动作是先trim(a),表里的每一条记录都要做一遍的
      

  3.   

    这根索引是用trim(a)建的还是a建的没关系,它只是先执行trim(a)这个表达式了,然后用它作where的约束条件来使用索引
      

  4.   

    那为了提高查询效率是不是只能增加一列 b = trim(a) 在b上建索引和查询。尤其他更好的方法吗?
      

  5.   

    faint,请先搞明白什么是函数索引。建立trim(a)的所以可以解决楼主的问题了。只是基于函数的索引需要CBO,和对索引分析的数据作为前提。楼主执行一下:
    analyze table t compute statistics
       for table
       for all indexes
       for all indexed columns;再看你的执行计划吧