什么叫
revised key index?
反键索引是
BTree
索引的一个分支,它的设计是为了运用在某些特定的环境下的。
Oracle
推出它的主要目的就是为了降低在并行服务器(
Oracle Parallel Server
)环境下索引叶
块的争用。当
BTree
索引中有一列是由递增的序列号产生的话,那么这些索引信息基本上
分布在同一个叶块,当用户修改或访问相似的列时,索引块很容易产生争用。反向索引中
的索引码将会被分布到各个索引块中,减少了争用
.
例子:有一个字段
id
,他的值落在一个很小的区间,比如从
9000-9999
,如果建
b-tree
索引,那么值过于紧密,反键的原理是把值取反,那么
id
的区间就从
0009-9999
,区间
就被放大,这个时候通过索引来查找数据效率会比较高(
oracle
这么说的)。
好处是
:
解决了树的倾斜问题,而且可以解决在大量
IO
操作的情况下
,
防止硬盘在某个区域
操作过于频繁
,
引起”热点”问题。
树的分支:因为索引一般是按树这个数据结构来组织,所以有很多分支,把不同类别或范
围的数据存放在分支里,在符合条件的分支里查询比在全表查询效率高很多。
树的倾斜:树的某个分支过与庞大
,
而其他分支内容却很少,这样的索引非常不健康的,查
询速度也很慢,如上面的示例数据,都在
10000-20000
的分支,而
20000-30000
或者
以上的分支是空的。反转后把这些数据均匀分布到不同的分支,可以使索引更加健康,也
更有效率。
热点问题:由于系统在表数据的增删改查的同时,同时要承担索引开支,而这主要是硬盘
的
IO
操作,如果树是倾斜的,而且数据的增加是按一定顺序增长的,这种情况会导致硬盘
对某一固定区域操作频繁,会出现热点问题,而且出现瓶颈。
Oracle
五种索引:
1
)
btree index
:几乎所有的关系型数据库中都有
btree
类型索引,也是被最多使用的。
其树结构与二叉树比较类似,根据
rid
快速定位所访问的行。
B-Tree
索引是基于二叉树的,
由分支块(
branch block
)和叶块(
leaf block
)组成。在树结构中,位于最底层底块被
称为叶块,包含每个被索引列的值和行所对应的
rowid
。在叶节点的上面是分支块,用来
导航结构,包含了索引列(关键字)范围和另一索引块的地址。
2
)反向索引:反转了
btree
索引码中的字节,是索引条目分配更均匀,多用于并行服务
器环境下,用于减少索引叶的竞争。 反向索引又一个缺点就是不能在所有使用常规索引的
地方使用。在范围搜索中其不能被使用。
3
)降序索引:
8i
中新出现的索引类型,针对逆向排序的查询。
4
)位图索引:使用位图来管理与数据行的对应关系,多用于
OLAP
系统。 位图索引最好
用于低
cardinality
列(即列的唯一值除以行数为一个很小的值,接近零),例如又一个
“性别”列,列值有“
Male”
,“
Female”
,“
Null”
等
3
种,但一共有
300
万条记录,那么
3/3000000
约等于
0
,这种情况下最适合用位图索引。位图以一种压缩格式存放,因此占
用的磁盘空间比
B-Tree
索引要小得多。
5
)函数索引:这种索引中保存了数据列基于
function
返回的值,在
select * from
table where function(column)=value
这种类型的语句中起作用。基于函数的索引也
是
8i
以来的新产物,它有索引计算列的能力,它易于使用并且提供计算好的值,在不修改
应用程序的逻辑上提高了查询性能。使用基于函数的索引有几个先决条件:
(
1
)必须拥有
QUERY REWRITE
(本模式下)或
GLOBAL QUERY REWRITE
(其他模
式下)权限。
(
2
)必须使用基于成本的优化器,基于规则的优化器将被忽略。
(
3
)必须设置以下两个系统参数:
QUERY_REWRITE_ENABLED=TRUE
评论