Oracle
b-tree 标签描述

DML操作时索引的更新行为 我们再来看一下做更新时,索引又是如何做的? 执行如下SQL,对以’990’结尾的字符串进行更新,更新后的值为以’997’结尾的字符串。 图90 由前边对索引根块的分析(请参见图84)可知,更新后的值,也仍然应落在最后一个叶子块上。查看最后一个叶子块中的数据情况: 图91 如上图所示,从“kdxconro6”来看,索引条目数仍为6,和更新前是一样的。 图92 如上图所示,我们发现更新前的值—以’990’结尾的字符串仍存在,并没有变为’997’结尾的字符串,而是被标记上了删除标志D(row2[6499]flag:—D–)。更新后的新值,是做为一个新的索引条目...

索引的访问方法之范围扫描 索引范围扫描(INDEXRANGESCAN)可以发生在唯一索引之上,也可以发生在非唯一索引之上。索引范围扫描也是我们最常见到的索引访问方法。索引范围扫描时,并不会像索引唯一扫描那样,一找到满足相关条件的索引条目后即停止,不会再有尝试扫描后续索引条目的动作。而是会一直扫描到第一条不满足相关条件的索引条目后才会停止。这可能是称之为范围扫描的重要原因。而且,当访问的索引不是唯一索引时,即便是在索引列上进行相等的逻辑比较操作,也会访问多个索引条目,并且可能找到多个满足过滤条件的索引条目。 下面,我们沿用索引唯一扫描中构建的表,删除c1列上原有的唯一索引,在c1列上新建一个非唯...

索引的分裂行为 当某个索引块中要插入新的索引条目,但其中又没有可用空间时,就会发生索引的分裂。根据分裂发生所在的索引块类型的不同,可以分为在根块上发生的分裂,在分支块上发生的分裂和在叶子块上发生的分裂。下面,就这三种情况做分别介绍。 从前面的实验中,我们已经看到,大约每个索引块中可以放下13个索引条目。所以,我们通过以下SQL,创建了新的测试表和索引: 图98 查看此时的索引树形结构信息,如下图所示: 图99 如上图所示,目前索引中只有一个索引块,是根块,分支块和叶子块三合一的状态。 查看此时该索引块中的数据内容: 图100 如上图所示,我们可以看到此时索引块中共有13个索引条目(...

DML操作时索引的维护 当我们对表进行DML(增、删、改操作)操作时,已存在的索引是如何同步维护的呢?当我们了解并理解了其工作原理后,在对索引进行管理和维护工作时,就可以避免一些对索引认识的错误,从而导致做了一些无用的,甚至是弊大于利的工作。 首先,我们先创建测试用表和索引,如下所示: 图80 如上所示,我们创建了一个名为tab_dml表,该表由两列构成。其中c1列做为测试索引的索引列,其数据类型为char(500)。之所以将其设置为该数据类型,目的是用较少的记录数,就可以模拟出多层的索引。 查看此时索引的树形结构,如下所示: 图81 如上所示,这是一个2层的索引,有1个根块和16个叶...

索引的访问方法之跳跃扫描 索引跳跃扫描(INDEXSKIPSCAN)是一种只会在组合索引(也称联合索引)上发生的索引访问方法。当我们在A、B两列(也可以更多,但至少要有两列)上创建组合索引后,假设A列在前,B列在后。当我们在SQL的WHERE子句没有用到A列做为过滤条件时,就有可能发生索引的跳跃扫描。之所以称之为“跳跃扫描”,有两种说法:一种是说这种访问方法,好像是“跳“过了前导列A,故名跳跃扫描;另一种说法是当我们从叶子块这一层来观察时,我们会发现前边介绍的四种索引扫描方法(唯一扫描、范围扫描、快速全扫描、全扫描),在叶子块这一层的访问是连续的。比如,唯一扫描只会访问其中一个叶子块;范围扫描...

DML操作时索引的删除行为 当我们将表中原有的一行记录时删除后,相应列上的索引又会怎么做呢? 执行删除C1列以’985’结尾的记录的操作后,观察叶子块中的数据的变化情况: 图88 如上图所示,我们可以看到表示叶子块中的索引条目数的kdxconro值,仍然为6,即表示此刻该叶子块中,仍然有6条索引条目。而且,表示索引块中可用空间多少的kdxcoavs的值,也没有变化。但是,我们所删除的那一行记录,所对应的“row1[7010]flag:—D—”中,我们可以看到在flag部分出现一个标志“D”,其表示该索引条目已被删除了。 此时,我们如果查看索引的树形结构信息,会看到如下内容: 图89 如...

索引的访问方法之全扫描 索引全扫描(INDEXFULLSCAN)虽然与索引快速全扫描只差了“快速”(FAST),但其访问方法却与后者有明显差别:其一,索引全扫描是单块读,而索引快速全扫描是多块读。其二,索引全扫描是按叶子块的逻辑顺序,依序读取的,所以,它可以保证读取的值是有序的。而索引快速全扫描不能保证。第三,索引全扫描会沿着索引树形结构中定位最左侧(或最右侧)叶子块的路径,访问相关的索引根块和分支块,然后从该最左侧(或最右侧)叶子块开始,沿着叶子块中的双向链表,依序访问全部的叶子块。因此,索引全扫描只会访问部分分支块。 下面,我们仍然沿用前面创建的表和索引,来观察索引全扫描的行为。 由于在我...

索引的访问方法之快速全扫描 索引快速全扫描(INDEXFASTFULLSCAN)是索引的各种扫描方法中,唯一会以多块读的方式来访问索引。如果把索引想象为表,则其行为类似于全表扫描。 下面,我们继续沿用索引范围扫描中创建的索引,来构建索引快速全扫描的行为并观察之。 图51 我们还是用10200event来跟踪对索引块访问的次序,为节省篇幅,详细的操作步骤这里不再重复,操作方法与索引唯一扫描中的相应操作是类似的。这里,只展示跟踪的结果: 图52 如上图所示,我们可以看到其读取索引块时,是按照数据块在文件中的顺序(块号)来读取的,并不是按照索引块在索引树形结构中的逻辑顺序读取的。 同时,在上...