查看: 1618|回复: 25

Oracle基于函数的索引

[复制链接]
发表于 2012-10-24 05:07:44 | 显示全部楼层 |阅读模式

Oracle基于函数的索引

  比如执行如下一条SQL语句:select * from emp where upper(ename) = 'KING',即使在ename上建立了索引,还是会全表扫描emp表,将里面的ename字段改成大写跟常量KING进行比较。如果我们建立一个基于函数的索引,比如:create index emp_upper_idx on emp(upper(ename)); 这个时候,我们只需要按区间扫描小部分数据,然后获取rowid取访问表中的数据,这个速度是比较快的。

      基于函数的索引,类似于普通的索引,只是普通的索引是建立在列上,而它是建立在函数上。当然这回对插入数据有一定影响,因为需要通过函数计算一下,然后生成索引。但是插入数据一般都是少量插入,而查询数据一般数据量比较大。为了优化查询速度,稍微降低点插入速度是可以承担的。
     
      函数索引还有一个功能,只对部分行建立索引。假设有一个很大的表,有一列叫做FLAG,只可能取Y和N。假设大部分数据是Y,小部分数据是N,我们需要将N修改成Y。如果建立一个普通索引,这个索引会非常大,而且将N修改成Y的时候,维护这个索引开销会很大。不过这个表听起来比较适合位图索引,但这是一个事物系统(OLTP),可能有很多人同时插入记录,或者进行修改。那么位图索引也不适合。所以,如果我们只是在值为N的行上建立索引,就比较好办了。

      只在值为N的行建立索引SQL:create index flag_index on big_table(case flag when 'N' then 'N' end);这样一个索引大小会大大降低,而且维护成本也会很低的。前提是我们只对值为N的行感兴趣。
发表于 2012-10-25 09:14:00 | 显示全部楼层
顶一个先  
发表于 2012-10-25 10:39:31 | 显示全部楼层
呵呵 那就好好玩吧~~~~  
发表于 2012-10-25 16:25:57 | 显示全部楼层
读10年语文,不如聊半年QQ  
发表于 2012-10-26 00:06:53 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2012-10-26 07:03:06 | 显示全部楼层
太棒了!  
发表于 2012-10-26 11:59:29 | 显示全部楼层
我的妈呀,爱死你了  
464793604 该用户已被删除
发表于 2012-10-27 16:06:39 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2012-10-27 21:54:30 | 显示全部楼层
不错!  
发表于 2012-11-1 17:02:38 | 显示全部楼层
回复一下  
高级模式
B Color Image Link Quote Code Smilies

本版积分规则