Oracle中的索引讲解


当前第2页 返回上一页

索引块的一个索引行中存储键值和起止Rowid,以及这些键值的位置编码。

位图索引存储数据的方式相对于B-Tree索引,占用的空间非常小,创建时不需要排序,定位存储,创建和使用非常快。

位图索引的特点:

  • Bitmap索引允许键值为空,对位图索引列进行is(not) null查询时,则可以使用索引。
  • Bitmap索引对表记录的高效访问。当使用count(XX),可以直接访问索引就快速得出统计数据。当根据位图索引的列进行and,or或 in(x,y,..)查询时,直接用索引的位图进行或运算。
  • Bitmap索引对批量DML操作只需进行一次索引。
  • 位图索引由于用位图反映数据,不同会话更新相同键值的同一位图段,insert、update、delete相互操作都会发锁定(未提交时)。
  • 由于并发DML操作锁定的是整个位图段的大量数据行,所以位图索引主要是用于联机分析处理(OLAP)应用。

四、函数索引

比如执行如下一条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的行建立索引:

create index flag_index on big_table(case flag when 'N' then 'N' end);

这样一个索引大小会大大降低,而且维护成本也会很低的。前提是我们只对值为N的行感兴趣。

五、维护索引

  • 字典表:all_indexes、user_indexes
  • 重建索引:alter index dep_idx rebuild [online]
  • 删除索引:drop index dep_idx;

到此这篇关于Oracle索引的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。


打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...