当前位置 博文首页 > F_xiao_chou的博客:B树索引和位图索引介绍

    F_xiao_chou的博客:B树索引和位图索引介绍

    作者:[db:作者] 时间:2021-09-15 16:36

    一 ?前言:??ROWID:包含键值的行的行ID,(查找块的最快方法,类似于门牌号)??因为所有行属于同一个段,所以要使用受限的ROWID?指向表行

    索引是数据库为了提高查询效率提供的一种冗余结构,保守计算数据库50%以上的调优可以通过调整索引来进行优化;

    引用国内一位资深的ORACLE专家的话:"我其实只懂点(挨踢)知识,IT里面其实只懂点甲骨文,甲骨文里面其实只懂点数据库,数据库里面其实只懂点SQL,SQL里面其实只懂点索引"——"你才是真正的专家!"

    根据个人的浅薄的经验,作为DBA的日常运维会越来越少,从数据库的每个版本的更新来看,数据库系统已经趋向越来越智能话,DBA能干的活也越来越少了,如果一个DBA只能做做日常的表空间扩容、数据库的备份恢复、启停、系统的更新,那么将是很危险的一件事。而调优自古以来就是一门很高深的学问,如果能把这个做好了,那么DBA能够创造的价值和在公司的作用中,将越来越显著;

    说了这么多,应该引入主题了,如果要做好调优,先从索引入手吧。

    后续的章节中将陆续更新索引的一些知识,第一章从索引的类别开始吧;

    ?

    二 ?索引在结构上的类别可划分如下:

    B树索引、

    位图索引、

    散列索引、

    反转索引等

    三 ?索引的介绍:

    1、B树索引(BTREE) ?树 - 二叉 , B , 红黑

    B数索引是我们日常工作最最常用的索引,大家平时在工作中说的"索引"默认都是B数索引;

    索引其实很简单,也很容易理解,用一本书的目录来形容最为贴切了,B树索引的结构跟图书馆的目录也很像

    上图中使用索引遍历过程如下:

    先找到id<=50的分支块,再找到30-40的分支块,在找到id=31对应的索引项,之后通过叶节点双向链接,平行地找到包含id=2的索引块,完成对id的查询。

    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?和位图段用于定位包含键值的行。

    对表中的键列进行更改后,也必须修改位图。这会导致相关的位图段被锁定。由于锁是在整个位图段上获得的,因此,在第一个事务处理结束之前,其它事务处理不能更新位图覆盖的行。

    cs