Oracle的函数及位图索引
一. 函数索引
1.1 函数索引的原理:
使用基于函数的索引可建立函数返回值的索引。服务器根据索引表达式执行搜索时,不必为每个关键字值调用函数,该函数索引相当于表的一个虚拟列,虽然不真正存于表中,但存于索引结构中。这个函数可以是一个内置 SQL 函数、外部提供的 PL/SQL 函数、或用户编写函数。
1.2 函数索引的好处:
- 利用函数索引可以只对限定的键值创建索引,节约空间,提高效率。
- 利用函数索引可以避免where子句中使用函数时的全表扫描,提高查询效率。
- 使不走索引的SQL使用索引
- 减少递归调用
1.3 函数索引对性能的影响
当然这会对插入数据有一定影响,因为需要通过函数计算一下,然后生成索引。如果插入数据量不大,而查询数据量比较大。那么为了优化查询速度,稍微降低点插入速度是可以承担的。
二. 位图索引
2.1 什么是位图索引
位图索引是指用位图表示的索引,oracle对于选择度底的列的每个键值建立一个位图,位图中的每一位可能对应多个列,位图中位等于1表示特定的行含有此位图表示的键值。
2.2 位图索引的优势:
- 减少即席查询的相应时间
- 和其它类型索引比较,真正节约了索引数据空间
- 即使在非常差的硬件上,也可能会有戏剧化的性能提升
- 高效的并行DML和LOAD操作。
- 生成索引的时候更高效,首先是不排序,其次是占用的空间少(索引空间)。
- 可以通过位图索引直接计数。
2.3 位图索引不适用场景:
- 列的基数比较多,不适合位图索引,因为它会占用更多的存储空间。
- 索引列DML频繁的列,不适合位图索引,容易造成死锁。
三. 反向键索引
3.1 什么是反向键索引
反向键索引也是一种B树索引,但是它与一般的B树索引相比又有一个很奇特的地方。反向键索引将索引键值的每一个字节做一个翻转变换,举一个例子:数字123456在反向键索引中的存储形式便是654321。
好处是消除了热块竞争。坏处是范围查询根本无法使用!
3.2 反向键索引的应用场景
反向索引主要是建立在那些以序列号生成的列上,可以将本来是连在一起的index entry分散到不同的leaf block中去,当索引是从序列中取的时候,如果是一般的b-tree 索引,在大量的插入后会导致块的分裂以及树的倾斜,使用reverse key index可以使索引段条目被更均匀的分布,所以,reverse index主要是缓解右向增长的索引右侧叶子节点的争用,因此常用于解决被索引引起的热块问题。
四. 全文索引
4.1 什么是全文索引
全文索引就是通过将文字按照某种语言进行词汇拆分,重新将数据组合存储,来达到快速检索的目的。全文索引不是按照键值存储的,而是按照分词重组数据,常用于模糊查询Where name like ‘%leonarding%’效率比全表扫描高很多。
4.2 全文索引的典型应用场景
- 普通查询,创建OracleText中Context类型的索引,生成大量的关键词,用于加快类似于普通的like ‘%xx%’操作速度,或者查询一些比较大的文档。可以使用contains函数进行数据检索。缺点:比较依赖于关键词和文档格式。有时可能不太准确。
- 目录信息Ctxcat(context catelog) 索引为事务维护,也就是说更改数据的时候会更新索引,不需要像context类型的全文索引一样每次更改数据后执行CTX_DDL.SYNC_INDEX刷新操作。
- 文档分类,创建规则表,根据关键词,对文档进行分类操作。比较适合对比较大的文档进行分类的操作。索引类型:ctxsys.ctxrule
用于将文档分类的应用