B树索引和位图索引的结构介绍
http://blog.itpub.net/12679300/viewspace-1174236/
一 前言:? ROWID:包含键值的行的行ID,(查找块的最快方法,类似于门牌号)? 因为所有行属于同一个段,所以要使用受限的ROWID 指向表行
索引是数据库为了提高查询效率提供的一种冗余结构,保守计算数据库50%以上的调优可以通过调整索引来进行优化;
引用国内一位资深的ORACLE专家的话:"我其实只懂点(挨踢)知识,IT里面其实只懂点甲骨文,甲骨文里面其实只懂点数据库,数据库里面其实只懂点SQL,SQL里面其实只懂点索引"——"你才是真正的专家!"
根据个人的浅薄的经验,作为DBA的日常运维会越来越少,从数据库的每个版本的更新来看,数据库系统已经趋向越来越智能话,DBA能干的活也越来越少了,如果一个DBA只能做做日常的表空间扩容、数据库的备份恢复、启停、系统的更新,那么将是很危险的一件事。而调优自古以来就是一门很高深的学问,如果能把这个做好了,那么DBA能够创造的价值和在公司的作用中,将越来越显著;
说了这么多,应该引入主题了,如果要做好调优,先从索引入手吧。
后续的章节中将陆续更新索引的一些知识,第一章从索引的类别开始吧;
二 索引在结构上的类别可划分如下:B树索引、位图索引、散列索引、反转索引等
三 索引的介绍:
1、B树索引(BTREE
B数索引是我们日常工作最最常用的索引,大家平时在工作中说的"索引"默认都是B数索引;
索引其实很简单,也很容易理解,用一本书的目录来形容最为贴切了,B树索引的结构跟图书馆的目录也很像
B树索引的结构:
索引的顶层为根,它包括指向索引中下一层次的条目。下一层次为分支块,它又指向位于索引中下一层索引中下一层次的块,最底层的是叶节点,它包含指向表行的索引条目。叶块是双向关联的,这边与按键值升序或降序扫描索引;
索引叶条目的格式
一个索引条目包含以下组件:
? 条目头:存储列数和锁定信息
? 键列长度/值对:用于定义键中的列大小,后面跟随列值(此类长度/值对的数目就是索引中的最大列数)。
索引叶条目的特性
在非分区表的B 树索引中:
? 当多个行具有相同的键值时,如果不压缩索引,键值会出现重复
? 当某行包含的所有键列为NULL 时,该行没有对应的索引条目。因此,当WHERE 子句指定了NULL 时,将始终执行全表扫描
对索引执行DML 操作的效果
对表执行DML 操作时,Oracle 服务器会维护所有索引。下面说明对索引执行DML 命令产生的效果:
? 执行插入操作导致在相应块中插入索引条目。
? 删除一行只导致对索引条目进行逻辑删除。已删除行所占用的空间不可供后面新的叶条目使用。
? 更新键列导致对索引进行逻辑删除和插入。PCTFREE 设置对索引没有影响,但创建时除外。即使索引块的空间少于PCTFREE 指定的空间,也可以向索引块添加新条目。
该图更能体现索引的结构
2、位图索引
位图索引(bitmap index)是从Oracle7.3 版本开始引入的。目前Oracle 企业版和个人版都支持位图索引,但标准版不支持。
位图索引在平时的OLTP系统中比较少见,但是在OLAP系统中就会经常见到,号称数据仓库调优的三个利器之一;
位图索引(通过在以下特定情况下,位图索引比B 树索引更有优势:
? 表具有数百万行且键列的基数较低时(也就是列的不同值极少时)。例如,对于护照记录表中的性别和婚姻状况列,位图索引可能比B 树索引更可取。
? 经常使用包含OR 运算符的多个WHERE 条件组合进行查询时
? 键列上的活动为只读活动或少量更新活动时(OLAP系统的特点)
位图索引的结构
位图索引也可以按B 树形式进行组织,但是,叶节点会存储每个键值的位图,而不是行ID 列表。位图中每一位与一个可能的行ID 对应,如果设置了该位,则表示具有对应行ID 的行包含键值。
如图所示,位图索引的叶节点包含:
? 条目头,其中包含列数和锁定信息
? 由每个键列的长度/值对组成的键值(在幻灯片的示例中,关键字只由一列组成;第一个条目的键值为Blue)
? 开始ROWID,在本示例中它指定块号10、行号0 和文件号3
? 结束ROWID,在本示例中它指定块号12、行号8 和文件号3
? 由位字符串组成的位图段(如果对应行包含键值,则会设置位;如果对应行不包含键值,则不会设置位。Oracle 服务器使用已获专利的压缩技术存储位图段。)开始ROWID 是位图中的位图段指向的第一行的行ID,也就是说,位图的第一位对应于该行ID,位图的第二位对应于块中的下一行。结束ROWID 是一个指针,它指向由位图段覆盖的表中的最后一行。位图索引使用受限的行ID。
使用位图索引
B 树用于定位叶节点,这些节点包含指定键值的位图段。开始ROWID 和位图段用于定位包含键值的行。
对表中的键列进行更改后,也必须修改位图。这会导致相关的位图段被锁定。由于锁是在整个位图段上获得的,因此,在第一个事务处理结束之前,其它事务处理不能更新位图覆盖的行。
文档的篇幅有限,先介绍最常见的B树索引和位图索引,这只是入门的第一步,后续将会陆续更新,多谢各位的关注。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
本文作者:JOHN
ORACLE技术博客:ORACLE 猎人笔记 数据库技术群:367875324 (请备注ORACLE管理 )
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++