[转帖]B树索引和位图索引的结构介绍

丶灬走出姿态 提交于 2019-12-04 10:10:46

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管理 )  

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!