Oracle之函数索引修改,重建索引

--函数索引陷阱  
--自定义函数使用函数索引要注意函数代码改变后的影响。     
drop table t purge;
create table t ( x number, y varchar2(30));  
set autotrace off     
insert into t SELECT rownum, rownum||'a' FROM dual connect by rownum < 1000;
create or replace                                                                  
package pkg_f is                                           
function f(p_value varchar2) return varchar2 deterministic;
end;                                                       
/    


create or replace                                                                                   
package body pkg_f is                       
function f(p_value varchar2) return varchar2
deterministic is                            
begin                                       
return p_value;                             
end;                                        
end;                                        
/   


create index idx_pkg_f_y on t ( pkg_f.f(y));      
analyze table t compute statistics for table for all indexes for all indexed columns; 
set autotrace on explain   
SELECT * FROM t WHERE pkg_f.f(y)= '8a';   


将包的代码修改如下:
create or replace                                                        
package body pkg_f is                       
function f(p_value varchar2) return varchar2
deterministic is                            
begin                                       
return p_value||'b';                        
end;                                        
end;                                        
/    


惊奇地发现查询出错误的值:
SELECT * FROM t WHERE pkg_f.f(y)= '8a';  


在索引重建查询没有记录,这才是正确的结果:  
drop index idx_pkg_f_y;      
create index idx_pkg_f_y on t ( pkg_f.f(y));    

SELECT * FROM t WHERE pkg_f.f(y)= '8a';    

解析:当函数变更后,需要重建函数索引,不然查询结果不变。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值