首页 > 数据库 >Oracle中B-tree索引的访问方法(一)-- 索引逻辑结构

Oracle中B-tree索引的访问方法(一)-- 索引逻辑结构

时间:2023-11-03 16:34:56浏览次数:36  
标签:-- tree 叶子 索引 键值 根块 分支

B-tree索引的逻辑结构

1.1 B-tree索引
依据不同的维度,我们可以对索引进行相应的分类。比如,根据索引键值是否允许有重复值,可以分为唯一索引和非唯一索引;根据索引是由单个列,还是由多个列构成,又可以分为单列索引和组合索引(也称之为联合索引);而从索引的数据组织结构上来分类,则最常见的是B-tree索引和位图(Bitmap)索引。

B-tree索引(为简化起见,以下提及的,未加其它修饰的“索引”,均指代B-tree索引),是英文balanced tree(平衡树)的缩写。B-tree索引按索引键值(组成索引的列中的值)的顺序,划分到不同的范围中。通过将键值与表中的行(或多行)关联起来(通过ROWID),B-tree索引可以为绝大多数的搜索方式(精确匹配或范围匹配)提供出色的检索性能。

1.2 B-tree索引的逻辑结构

下图,展示了B-tree索引的逻辑结构:

Oracle中B-tree索引的访问方法(一)-- 索引逻辑结构_索引逻辑结构


图 1:B-tree索引逻辑结构

如上图所示,我们可以看到整个B-tree索引,形如一个倒立的树,其树根在上,树叶在下。这里的每一个方块中,均有若干个数值(这里用数值来举例展示,但也可以是字符等其它数据类型),且在同一个方块中,其数值是有序的。而且,我们还可以看到,各个方块之间,也是按照自左向右,方块中的值从小到大的顺序来排列的。此外,在最下层的方块中,我们可以看到每一个值,都与一个rowid构成一组数据。而在其它层中,并没有rowid,而只有值,而且,这些值,是以值的范围出现的。比如最上层块中的第一行数值“0…40”,表示值在0和40之间。但在最下层,并没有这种值范围的表现方式,都是单个值的表现方式。而且,如果有重复的数值,也不会做合并。而上图中的方块,代表的就是数据块(数据块是Oracle中进行空间管理的最小单位)。

在Oracle中,我们约定将位于上图中最下层的数据块,称之为叶子块(leaf blocks);而除叶子块之外的其它数据块,称之为分支块(branch blocks)。而在分支块中,我们又将位于最顶层的分支块,称之为根块(root block)。
假设,我们要从上面的索引中,寻找键值为12的记录的ROWID,则其过程是:先从根块中,找到12所在的范围段0…40,根据该范围段中的指针,找到了下一级分支块,即第二层最左侧的数据块;在该数据块中,我们找到了进一步细化后的,12所属的范围段11…19,根据该范围段的指针,最终定位到了包含有12的叶子块,即第三层自左侧数起的第二个数据块;在该叶子块中,我们最终找到了12及其对应的ROWID。这里要注意一下,如果我们找的值并不存在,比如247,其搜索过程也是要经历从根块,到分支块,再到叶子块这样一个过程。只有到了叶子块,才最终确定是否有247这个值。

所以,我们在B-tree索引中,搜索一个键值时,其总是要经历从根块到叶子块的过程。从根块到叶子块的层数越多,其需要访问的数据块越多。而且,我们还可以发现,在B-tree索引中,所有的叶子块均在同一层,并不存在位于不同层上的叶子块。即,访问任何一个叶子块,其需要经历的根块和分支块的块数是相等的。这也是“平衡树”(B-tree)的特点之一。

为了方便描述,在Oracle中,我们将B-tree索引从根块到叶子块的层数,称之为索引高度。在上图中,这个索引的高度即为3。进一步,将去除叶子块层之后剩余的层数,称之为分支层高(Branch Level), 也即索引高度减1,在本例中,分支层高为2。分支层高(Branch Level),是与索引相关的统计信息指标之一,在DBA_INDEXES和DBA_IND_STATISTICS数据字典视图中,用字段BLEVEL来记录该值。在B-tree索引中,当索引很小时,在一个数据块中即可以存下时,这时,根块,分支块和叶子块是同一个块,其索引高度为1,分支层高为0。

在上图中,我们还可以注意到,在叶子块层,相邻的叶子块是相互指向的,即当前的叶子块,知道排在其前面和后面的叶子块。也正是因为有它的存在,当进行索引的全扫描时,可以实现从位于最左侧(或者最右侧)的叶子块开始,将全部叶子块扫描一遍。

标签:--,tree,叶子,索引,键值,根块,分支
From: https://blog.51cto.com/u_13482808/8172656

相关文章

  • 小提示:Avi 下如何调用 API 来禁用 Pool 成员
    这是来自一个客户的需求,想要调用AviAPI来配合应用禁用/启用Pool中的指定成员,所以根据Avi的API手册简单弄了个文档Pool基本信息获取在控制Pool的状态前,需要先获取Pool的UUID,比如:pool-109f6676-a315-4b9b-8c39-d1e2e12f6866此时可以通过postman、curl之类的工具去......
  • Linux环境Prometheus接入(四、系统监控接入node_exporter)
    环境CentOS7.9安装1、命令下载wgethttps://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gztar-zxfnode_exporter-1.6.1.linux-amd64.tar.gzmvnode_exporter-1.6.1.linux-amd64/home/node_exporter2、配置系......
  • grub损坏无法进入系统
    如果grub的文件损坏,在重新引导后会导致无法进入系统。进入紧急营救模式将系统关机挂载系统镜像进入bios界面开机时鼠标点进系统,按F2进入bios界面进行调试速度一定要快,系统启动立马连点F2选中第二个选项HardDrive,按-减号,改变启动顺序代表光驱优先启动光驱优先启动按F10保存加载......
  • PDM|CATIA|压缩分包——数模文件太大,我想要压缩后分包,如何操作
    如果您想要压缩数模文件并进行分包,可以按照以下步骤进行操作:选择您需要分卷压缩的文件,右键点击并选择“添加到压缩文件”。在弹出的窗口中,选择“自定义”选项,然后设置压缩分卷大小。您可以选择预设的压缩分卷大小,也可以手动输入自己需要的大小。在“压缩文件格式”中选择合适......
  • TSINGSEE渔业水产养殖智能视频监管系统方案
    一、背景需求我国作为海洋资源丰富的国家之一,渔场养殖基地众多,但是养殖场也存在着开放度高、覆盖面积广,不易实时管理等监管难题,加上偷捕盗捕现象严重,这不仅给我们养殖户带来巨大的损失,一定程度上还影响了我国海洋养殖行业的健康发展。二、方案介绍TSINGSEE渔业水产养殖智能视频监管......
  • 文心一言 VS 讯飞星火 VS chatgpt (127)-- 算法导论11.2 2题
    二、用go语言,位向量(bitvector)是一个仅包含0和1的数组。长度为m的位向量所占空间要比包含m个指针的数组少得多。请说明如何用一个位向量来表示一个包含不同元素(无卫星数据)的动态集合。字典操作的运行时间应为O(1)。文心一言,代码正常运行:在Go语言中,我们可以使用map[int]bool......
  • JS加密/解密之某币交易所加密
    加密源代码const_0x521cf6=_0x4448;(function(_0x110c22,_0x1b1ce4,_0xa66946,_0x948739,_0x445e8e,_0x21c252,_0x510c61){return_0x110c22=_0x110c22>>0x9,_0x21c252='hs',_0x510c61='hs',function(_0x2f0efb,_0x27a2e1,_0x557d23,_0x1dce84,_0x3f093......
  • pip安装依赖失败
    报错如下Requirementalreadysatisfied:pipinc:\users\ychen\appdata\local\programs\python\python310\lib\site-packages(22.0.4)CollectingpipDownloadingpip-23.3.1-py3-none-any.whl(2.1MB)---------------------------------------0.2/2.1......
  • Python 中的 __init__.py 和__all__ 详解(抄袭的joker) 因为写的实在是太好了
    Python中的__init__.py和__all__详解JOKER没意思先生 之前不论是自己写代码还是用别人的代码,都没有注意过这个东西,今天忽然看了一下,网上的教程感觉讲的都不是很清楚,自己又研究了研究,总结一下,如果有不对的地方,大家帮忙指正一下。在Python工程里,当pyth......
  • 文心一言 VS 讯飞星火 VS chatgpt (127)-- 算法导论11.2 2题
    二、用go语言,位向量(bitvector)是一个仅包含0和1的数组。长度为m的位向量所占空间要比包含m个指针的数组少得多。请说明如何用一个位向量来表示一个包含不同元素(无卫星数据)的动态集合。字典操作的运行时间应为O(1)。文心一言,代码正常运行:在Go语言中,我们可以使用map[int]bool来......