数据库版本: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。略)。
怀疑是什么地方设置有问题。会是什么原因呢?求助。
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。略)。
怀疑是什么地方设置有问题。会是什么原因呢?求助。
需要修改初始化参数
query_rewrite_enabled=true
query_rewrite_integrity=trusted
必须有系统权限QUERY REWRITE,从而在你自己的模式中的表上创建基于函数的索引。
必须有系统权限GLOBAL QUERY REWRITE,从而在其他模式中的表上创建基于函数的索引。
要让优化器使用基于函数的索引,必须设置以下会话或系统变量:QUERY_REWRITE_ENABLED=TRUE和QUERY_REWRITE_INTEGRITY=TRUSTED。
对于9ir2及以上版本,则不受上述限制。