深入理解Oracle索引(18):函数索引的陷阱以及如何避免索引被污染
2013-06-06 22:29
609 查看
㈠ 函数索引的陷阱
使用函数索引一定要注意在函数代码变更后重建函数索引、否则、Oracle将返回错误结果但不给提示
测试如下:
㈡ 避免索引被污染
这里给出 2 条意见、
① 不要在字段前增加函数
如:
to_char(start_time,'yyyy.mm.dd') between '2013.06.06' and '2013.06.10'
和
start_time between to_date('2013.06.06','yyyy.mm.dd') and to_date('2013.06.10','yyyy.mm.dd')
任何时候都应该是第二种!!!
② 不要把字段嵌入到表达式中
如:
start_time + 7 < sysdate;
和
start_time < sysdate - 7
By David Lin
2013-06-06
Good Luck
使用函数索引一定要注意在函数代码变更后重建函数索引、否则、Oracle将返回错误结果但不给提示
测试如下:
hr@ORCL> drop table t purge; Table dropped. hr@ORCL> create table t (x number,y varchar2(30)); Table created. hr@ORCL> insert into t select rownum,rownum||'a' from dual connect by rownum<1000; 999 rows created. hr@ORCL> ed Wrote file afiedt.buf 1 create or replace function f_david(p_value varchar2) return varchar2 2 deterministic is 3 begin 4 return p_value; 5* end; 6 7 / Function created. hr@ORCL> create index idx_f_david_t on t (f_david(y)); Index created. hr@ORCL> exec dbms_stats.gather_table_stats(ownname=>'HR',tabname=>'T',estimate_percent=>100,cascade=>TRUE,no_invalidate=>false); PL/SQL procedure successfully completed. hr@ORCL> select * from t where f_david(y)='8a'; X Y ---------- ------------------------------ 8 8a hr@ORCL> ed Wrote file afiedt.buf 1 create or replace function f_david(p_value varchar2) return varchar2 2 deterministic is 3 begin 4 return p_value||'b'; 5* end; hr@ORCL> / Function created. /* 此时的函数 f_david 已经不是我们所认识的那个了、但是查询依然如故!!!*/ hr@ORCL> select * from t where f_david(y)='8a'; X Y ---------- ------------------------------ 8 8a /* 索引重建查询没有记录、这才是我们要的正确结果*/ hr@ORCL> drop index idx_f_david_t; Index dropped. hr@ORCL> create index idx_f_david_t on t (f_david(y)); Index created. hr@ORCL> exec dbms_stats.gather_table_stats(ownname=>'HR',tabname=>'T',estimate_percent=>100,cascade=>TRUE,no_invalidate=>false); PL/SQL procedure successfully completed. hr@ORCL> select * from t where f_david(y)='8a'; no rows selected
㈡ 避免索引被污染
这里给出 2 条意见、
① 不要在字段前增加函数
如:
to_char(start_time,'yyyy.mm.dd') between '2013.06.06' and '2013.06.10'
和
start_time between to_date('2013.06.06','yyyy.mm.dd') and to_date('2013.06.10','yyyy.mm.dd')
任何时候都应该是第二种!!!
② 不要把字段嵌入到表达式中
如:
start_time + 7 < sysdate;
和
start_time < sysdate - 7
By David Lin
2013-06-06
Good Luck
相关文章推荐
- 深入理解Oracle索引(18):函数索引的陷阱以及如何避免索引被污染
- 深入理解Oracle索引(18):函数索引的陷阱以及如何避免索引被污染
- 深入理解Oracle索引(8):如何进行索引监控分析和优化
- 深入理解Oracle索引(15):日期转换函数的格式参数大小写规则对函数索引的影响
- SQL Server-聚焦深入理解死锁以及避免死锁建议(三十三)
- 深入理解Oracle索引(25):一招鲜、吃遍天之单字段索引创建思路
- SQL Server-聚焦深入理解死锁以及避免死锁建议(三十三)
- 深入理解Oracle索引(21):视图和小表是否应该加索引
- 深入理解Oracle索引(22):索引和NULL 协同合作互惠共赢
- 深入理解Oracle索引(23):6 种常见不走索引的原因分析
- 深入理解C++对象模型-成员函数的本质以及虚函数的实现(非虚继承)
- javaAPI深入理解(1)如何截断一个List以及List.subList()方法的坑
- 深入理解Oracle索引(19):表被 delete 后、索引叶子块里 entry 条目的状态
- 深入理解Oracle索引(20):外键是否应该加索引
- 深入理解Oracle索引(22):索引和NULL 协同合作互惠共赢
- 深入理解Oracle索引(23):6 种常见不走索引的原因分析
- 深入理解Oracle索引(6):在实践中初步认识3大索引的使用场景
- 深入理解Oracle索引(17):Cost 值相同 CBO 对索引的选择
- 深入理解Oracle索引(17):Cost 值相同 CBO 对索引的选择
- Rhyme/Java 多态的深入理解—多态的详细分析以及多态应用之钩子函数的详细解释