转载请注明出处: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内部结构的更多相关文章

  1. git中working tree, index, commit

    这三个名字可以简单理解为文件在本地仓库存在的三种不同的位置. 如下,是做commit提交两段提交过程,工作区(working tree),暂存区(index)和 branch(commit). wor ...

  2. 基础:从概念理解Lucene的Index(索引)文档模型

    转:http://blog.csdn.net/duck_genuine/article/details/6053430   目录(?)[+]   Lucene主要有两种文档模型:Document和Fi ...

  3. 理解Device Tree Usage

    英语原文地址: htttp://devicetree.org/Device_Tree_Usage 本文介绍如何为新的机器或板卡编写设备树(Device Tree), 它旨在概要性的介绍设备树概念,以及 ...

  4. 理解Device Tree Usage(续)

    4 How Interrupts work   与遵循树的自然结构的地址范围转换不同, 中断信号可以起源于或者终止于板卡上的任何设备. 与设备树中自然表示的设备寻址不同,中断信号的表示独立于设备树节点 ...

  5. 深入理解Flink ---- Metrics的内部结构

    从Metrics的使用说起 Flink的Metrics种类有四种Counters, Gauges, Histograms和Meters. 如何使用Metrics呢? 以Counter为例, publi ...

  6. 使用git微命令深入理解git工作机制

    首先.这篇不是真正意义上的翻译,所以大家在看的时候不要找相应的英文文章相应着看.这篇文章之所以归类为翻译.是由于最開始有一篇英文文章让我对git内部机制有了清楚的认识,它能够说是我git的启蒙老师吧. ...

  7. java web前端easyui(layout+tree+双tabs)布局+树+2个选项卡tabs

    1.列出要实现的样式: 2.实现的代码: 分三大部分: 1):页面主体部分:mian.vm <html> <head> <title>Ks UI</title ...

  8. 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 ...

  9. 分布式图数据库 Nebula Graph 的 Index 实践

    导读 索引是数据库系统中不可或缺的一个功能,数据库索引好比是书的目录,能加快数据库的查询速度,其实质是数据库管理系统中一个排序的数据结构.不同的数据库系统有不同的排序结构,目前常见的索引实现类型如 B ...

随机推荐

  1. 解决SQL Server的TEXT、IMAGE类型字段的长度限制

    更多资讯.IT小技巧.疑难杂症等等可以关注 艾康享源 微信公众号. 来自为知笔记(Wiz)

  2. MySQL 连接

    MySQL 连接 使用mysql二进制方式连接 您可以使用MySQL二进制方式进入到mysql命令提示符下来连接MySQL数据库. 实例 以下是从命令行中连接mysql服务器的简单实例: [root@ ...

  3. asp.net 图片质量压缩(不改变尺寸)

    private static ImageCodecInfo GetEncoderInfo(String mimeType) { int j; ImageCodecInfo[] encoders; en ...

  4. [转]Delphi : keydown与keypress的区别,组合键

    Shift 是一个集合变量. type TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDoubl ...

  5. spring web flow 2.0入门(转)

    Spring Web Flow 2.0 入门 一.Spring Web Flow 入门demo(一)简单页面跳转 附源码(转) 二.Spring Web Flow 入门demo(二)与业务结合 附源码 ...

  6. Mysql 源码编译教程贴

    题外话:这是一篇教程贴,不仅学的是mysql的编译,还是一些编译的知识.我也是一个菜鸟,写一些感悟和心得,有什么问题可以批评指正,谢谢! 如果只是为了安装请移到我的另一篇安装贴: Mysql安装贴 环 ...

  7. YesFInder - Web File Manager 网页文件管理系统

    开发原由: 原来想找一下实现可视化图片上传程序,先找了ckfinder,发现居然是收费的,而且用起来也不顺手,于是想能不能自己写一个.想到这就立即动手,花2天时间完成初步功能,然后再花了3天完善.目前 ...

  8. [jQuery] $.grep使用

    1.$.grep的功能是查找过滤功能的数组,原数组不受影响. 2.参数定义 jQuery.grep( array, function(elementOfArray, indexInArray), [ ...

  9. FFT快速傅立叶

    Description 给出两个n位10进制整数x和y,你需要计算x*y. Input 第一行一个正整数n.第二行描述一个位数为n的正整数x.第三行描述一个位数为n的正整数y. Output 输出一行 ...

  10. 实验一:C语言实现DES加解密算法

    计算程序执行10万次需要的时间: 总共需要175秒 加解密一次的时间小于:0.00175秒 纯计算加解密的时间会更短 去除IO操作后的时间 也就是说加解密一次的时间为0.07毫秒 /*-------- ...