数据库版本:9i
SQL文:(非实际SQL,举例说明)
  SELECT * FROM TBL_A T
   WHERE P_COM.FUN(T.COLA.T.COLB) = 20110101注:P_COM.FUN()是一个自定义函数,定义在Package中。使用了DETERMINISTIC声明。索引和表已经ANALYZE过。在一个DB服务器中,函数索引被正确使用,所以代码上没有问题。
但是在另一个DB服务器中,做的总是全表扫描。声明指定索引也没用(SELECT /*+INDEX。略)。
怀疑是什么地方设置有问题。会是什么原因呢?求助。

解决方案 »

  1.   


    需要修改初始化参数
    query_rewrite_enabled=true
    query_rewrite_integrity=trusted
      

  2.   

    噢,学习了,查了下,Oracle从9I release 2 开始就对若要使用函数索引,都需要指定查询重写。
      

  3.   

    对于9ir1及以前使用函数索引,需要
     必须有系统权限QUERY REWRITE,从而在你自己的模式中的表上创建基于函数的索引。
     必须有系统权限GLOBAL QUERY REWRITE,从而在其他模式中的表上创建基于函数的索引。
     要让优化器使用基于函数的索引,必须设置以下会话或系统变量:QUERY_REWRITE_ENABLED=TRUE和QUERY_REWRITE_INTEGRITY=TRUSTED。
    对于9ir2及以上版本,则不受上述限制。