理解 B*tree index内部结构
转载请注明出处:http://write.blog.csdn.net/postedit/40589651
Oracle数据库里的B树索引就好象一棵倒长的树。它包括两种类型的数据块:一种是索引分支块,还有一种是索引叶子块 索引分支块包括指向对应索引分支块/叶子块的指针和索引健值列(这里的指针是指相关分支块/叶子块的块地址RDBA。
每一个索引分支块都会有两种类型的指针。一种是LMC,还有一种就索引分支的索引行记录所记录的指针.lmc是Left Most Child的缩写,每一个索引分支块都仅仅有一个lmc。这个lmc指向的分支块/叶子块中全部索引键值列中的最大值一定小于该lmc所在过引索分支块的全部索引键值列中的最小值;而索引分支块的索引行记录所记录的指针所指向的分支块/叶子块的全部索引键值列中的最小值一定大于或等于该行记录的索引键值列的值)。
注意:这个键值列不一定是完整的被索引键值,它可能仅仅是被索引键值的前缀。仅仅要Oracle能通过这些前缀区分对应的索引分支块/叶子块即可,这样Oracle就能够既节省索引分支的存储空间,又能够高速定位其下层的索引分支块/叶块。
其实。假设使用准确的名字来描写叙述关系型数据库中的B-Tree索引,并不能称其为B-Tree索引,而应当称其为B*-Tree索引。
因为没有必要很准确的学名,所以一般都使用它的广义名称。T-tree索引的结构就像它的名字所表述的意思那样相似一个树结构,从树干開始依次向树枝蔓延。直到树叶。
有人觉得是Binary的首字母
有人觉得是最早提出该理论的那个人的名字缩写
但更普遍的说法是它是单词“balanced”的首字母缩写---均衡
分支块头部中的“Lmc”是指比分支块中的第一行数据值小的下层数据块的地址(DBA),使用这样的表示方法不仅能够降低块中的所要存储行的数量,并且还能表示“未满”的意思。
这里的“未满”是指位于该分支块左边的索引中的值都小于这个分支块中第一行中的值。分枝块中的“Term”代表下层索引块中一部分没有被描写叙述的列值。在这里仅仅是为了简化问题,它有点相似于在比較运算符LIKE中能够把 ‘ABC%’简写为‘ABC’。
看以下的索引结构图:
/+*
drop table gyj_t1; create table gyj_t1 (
id int,
name varchar2(100)
); begin
for i in 1 .. 5000 loop
insert into gyj_t1 values(i,'gyj'||i);
commit;
end loop;
end;
/ 非唯一索引
create index idx_gyj_t1 on gyj_t1(id); 唯一索引
drop index idx_gyj_t1;
create unique index idx_gyj_t1 on gyj_t1(id); gyj@ZMDB> select object_id from dba_objects where object_name='IDX_GYJ_T1'; OBJECT_ID
----------
24515 gyj@ZMDB> select header_file,header_block from dba_segments where segment_name='IDX_GYJ_T1'; HEADER_FILE HEADER_BLOCK
----------- ------------
7 2618 +/
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3VveUpvZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
ALTER SESSION SET EVENTS 'immediate trace name treedump level 24515';
----- begin tree dump
branch: 0x1c00a3b 29362747 (0: nrow: 110, level: 1)
--DBA(16进制,10进制)
starting at –1 except root starting at 0
nrow: 110个branck或leaf
level : branch block level (leaf block implicitly 0)
root block split(一般是level发生改变了),branch block split。leaf block split(5-5,9-1)
high=level+1
leaf: 0x1c00a3c 29362748 (-1: nrow: 485 rrow: 485)
除了root其他的都是从-1開始。
nrow: number of all index entries (including deleted entries)
rrow: number of current index entries
level: leaf block implicitly 0
----- end tree dump
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3VveUpvZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3VveUpvZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
*********************************************************************************************转储枝块
alter system dump datafile 7 block 2619;
Branch block dump
=================
header address 139782541810252=0x7f21a8c01a4c
kdxcolev 1 +++index level (0 represents leaf blocks)level为1。
表示这是一个branch block >0 (root block)
KDXCOLEV Flags = - - -
kdxcolok 0 ++++++denotes whether structural block transaction is occurring
表示该索引上是否正在发生改动块结构的事务;
kdxcoopc 0x80: opcode=0: iot flags=--- is converted=Y +++internal operation code 表示Oracle内部操作代码
kdxconco 2 +++index column count 表示索引条目中列的数量
kdxcosdc 0 +++count of index structural changes involving block
表示索引结构发生变化的数量,当你改动表里的某个索引键值时,该值添加;
kdxconro 109 +++number of index entries (does not include kdxbrlmc pointer)
表示当前索引中的条目数量,不包括lmc指针
kdxcofbo 246=0xf6 +++offset to beginning of free space within block
kdxcofeo 6987=0x1b4b +++offset to the end of free space (i.e.. first portion of block containing index data)
kdxcoavs 6741 +++available space in block (effectively area between kdxcofbo and kdxcofeo)
kdxbrlmc 29362748=0x1c00a3c +++block address if index value is less than the first (row#0) value
kdxbrsno 0 +++last index entry to be modified
表示最后一个被改动的索引第目号。这里看到是0,表示该索引是新建的索引
kdxbrbksz 8056 +++size of usable block space 表示可用数据块的空间大小
kdxbr2urrc 0 +++这里在Oracle内部文档中没有说明,我通过bbed观察没有发现这个结构
row#0[8047] dba: 29362749=0x1c00a3d
col 0; len 3; (3): c2 05 57
col 1; TERM
row#1[8038] dba: 29362750=0x1c00a3e
col 0; len 3; (3): c2 0a 42
col 1; TERM
sys@ZMDB> select UTL_RAW.CAST_TO_NUMBER ('c20557') from dual;
UTL_RAW.CAST_TO_NUMBER('C20557')
--------------------------------
486 (nrow: 485)
sys@ZMDB> select UTL_RAW.CAST_TO_NUMBER ('c20a42') from dual;
UTL_RAW.CAST_TO_NUMBER('C20A42')
--------------------------------
965 (nrow: 479 ==> 486+479)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3VveUpvZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
********************************************************************************转储叶块
alter system dump datafile 7 block 2620;
Leaf block dump
===============
header address 140046263134820=0x7f5f0fc42a64
kdxcolev 0 +++index level (0 represents leaf blocks)
KDXCOLEV Flags = - - -
kdxcolok 0 +++denotes whether structural block transaction is occurring(表示结构块事务是否正在发生)
kdxcoopc 0x80: opcode=0: iot flags=--- is converted=Y +++internal operation code
kdxconco 2 +++index column count
kdxcosdc 0 +++count of index structural changes involving block(包括块的索引结构化改变数目
)
kdxconro 485 +++number of index entries (does not include kdxbrlmc pointer)
kdxcofbo 1006=0x3ee +++offset to beginning of free space within block
kdxcofeo 1830=0x726 +++offset to the end of free space (i.e.. first portion of block containing index data)
kdxcoavs 824 +++available space in block (effectively area between kdxcofbo and kdxcofeo)
kdxlespl 0 +++bytes of uncommitted data at time of block split that have been cleaned out
表示当叶子节点被拆分时未提交的事务数量
kdxlende 0 +++number of deleted entries
表示被删除的索引条目的数量
kdxlenxt 29362749=0x1c00a3d +++pointer to the next leaf block in the index structure via corresponding rba
表示当前叶子节点的下一个叶子节点的地址
kdxleprv 0=0x0 +++pointer to the previous leaf block in the index structure via corresponding
表示当前叶子节点的上一个叶子节点的地址
kdxledsz 0 +++deleted space 表示可用空间,眼下是0
kdxlebksz 8032 +++usable block space (by default less than branch due to the additional ITL entry)
row#0[8020] flag: ------, lock: 0, len=12 +++row header(1byte)+flag (2byte) +lock (1byte) + col 8 = 12
+++当中flag表示标记,比方删除标记等,lock表示锁定信息
col 0; len 2; (2): c1 02 +++索引键值
col 1; len 6; (6): 01 c0 00 87 00 00 +++文件号(2byte)+块号(2byte)+行号(2byte)
row#1[8008] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 03
col 1; len 6; (6): 01 c0 00 87 00 01
gyj@ZMDB> select id,name,dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid) block#,dbms_rowid.rowid_row_number(rowid) row# from gyj_t1 where id=1;
ID NAME FILE# BLOCK# ROW#
---------- ---------- ---------- ---------- ----------
1 gyj1 7 135 0
0x01 c0 00 87 00 00===>文件号:01 c0 块号:00 87 行号:00 00
。。。。
。。
。。
。
。。。。。。
。。。
。。。。
理解 B*tree index内部结构的更多相关文章
- git中working tree, index, commit
这三个名字可以简单理解为文件在本地仓库存在的三种不同的位置. 如下,是做commit提交两段提交过程,工作区(working tree),暂存区(index)和 branch(commit). wor ...
- 基础:从概念理解Lucene的Index(索引)文档模型
转:http://blog.csdn.net/duck_genuine/article/details/6053430 目录(?)[+] Lucene主要有两种文档模型:Document和Fi ...
- 理解Device Tree Usage
英语原文地址: htttp://devicetree.org/Device_Tree_Usage 本文介绍如何为新的机器或板卡编写设备树(Device Tree), 它旨在概要性的介绍设备树概念,以及 ...
- 理解Device Tree Usage(续)
4 How Interrupts work 与遵循树的自然结构的地址范围转换不同, 中断信号可以起源于或者终止于板卡上的任何设备. 与设备树中自然表示的设备寻址不同,中断信号的表示独立于设备树节点 ...
- 深入理解Flink ---- Metrics的内部结构
从Metrics的使用说起 Flink的Metrics种类有四种Counters, Gauges, Histograms和Meters. 如何使用Metrics呢? 以Counter为例, publi ...
- 使用git微命令深入理解git工作机制
首先.这篇不是真正意义上的翻译,所以大家在看的时候不要找相应的英文文章相应着看.这篇文章之所以归类为翻译.是由于最開始有一篇英文文章让我对git内部机制有了清楚的认识,它能够说是我git的启蒙老师吧. ...
- java web前端easyui(layout+tree+双tabs)布局+树+2个选项卡tabs
1.列出要实现的样式: 2.实现的代码: 分三大部分: 1):页面主体部分:mian.vm <html> <head> <title>Ks UI</title ...
- PAT 1127 ZigZagging on a Tree[难]
1127 ZigZagging on a Tree (30 分) Suppose that all the keys in a binary tree are distinct positive in ...
- 分布式图数据库 Nebula Graph 的 Index 实践
导读 索引是数据库系统中不可或缺的一个功能,数据库索引好比是书的目录,能加快数据库的查询速度,其实质是数据库管理系统中一个排序的数据结构.不同的数据库系统有不同的排序结构,目前常见的索引实现类型如 B ...
随机推荐
- birt报表中使用多个数据集。
这个问题困扰了几天,也没搜到答案,由于工作需要,创建了两个数据集和两个表格,第一个数据集和表格之间没有任何问题.但是第二个数据集拖过去就显示不可用,除非拖到表格外面,当然也就没用了.一朋友说拖一个网格 ...
- OC - 10.使用Quartz2D绘制个性头像
效果图 将一张图片剪切成圆形 在图片周围显示指定宽度和颜色的边框 实现思路 效果图中主要由不同尺寸的两大部分组成 蓝色的背景区域,尺寸等于图片的尺寸加上边框的尺寸 图片区域,尺寸等于图片的尺寸 绘 ...
- 安卓自写Adapter
代码: package com.example.ouradapter; import android.app.ListActivity; import android.content.Context; ...
- LINUX系统安装MYSQL命令,纯手打
1.下载安装包 wget http://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.26-linux-glibc2.5-x86_64.tar.gz 2. ...
- 2.2.5 NIO.2 Path 和 Java 已有的 File 类
NIO与IO交互 toPath() File -- Path toFile() Path -- File Demo: import java.io.File; import java.nio.file ...
- jQuery中事件的学习
刚学习了jQuery中的事件,主要通过bind(),toggle(),hover()来主要实现,下面先说一说关于bind的想关要点. 1.bind方法. bind方法的主要参数为bind(type,f ...
- 导出页面文档(只在IE8下测试过)
之前说过一篇关于打印的方法,就顺便也看了一下导出,但是该方法需要用户更改浏览器的安全级别设置,因此并不十分推荐,大家如真有需要可以参考一下ZeroClipboard这款插件,我有时间也会去学习一下并贴 ...
- 移除IOS下按钮的原生样式
写WAP页面的时候 一定要加上这组样式,以避免在IOS下面按钮被系统原生样式影响 input,textarea {outline-style:none;-webkit-appearance:none ...
- php开发中的url地址传输加密解密函数
function keyED($txt,$encrypt_key) //定义一个keyED { $encrypt_key = md5($encrypt_key); $ctr=0; $tmp = ''; ...
- highcharts实例教程一:结合php与mysql生成折线图
Highcharts是一款纯javascript和html5编写的图表库,不仅几乎能兼容所有pc浏览器,而且对ios和android手机端的兼容 性也不错,它能够很简单便捷的在Web网站或Web应用中 ...