索引块的一个索引行中存储键值和起止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索引的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。