深入剖析-Oracle索引分支块的结构

作者介绍

崔华   网名 dbsnake

Oracle ACE Director,ACOUG 核心专家

重要结论

1、每个索引分支块都只有一个lmc,这个lmc指向的分支块/叶子块中的所有索引键值列中的最大值一定小于该lmc所在分支块的所有索引键值列中的最小值;

2、索引分支块的行记录所对应的存储格式为“行头 + 分支块/叶子块的RDBA + col 0 + col 1”,其中col 0为索引键值列,等于该行行头“分支块/叶子块的RDBA”所指向的叶子块中的第一行索引行所对应的数据行的ROWID

实例解析

通过实例解析Oracle索引分支块的结构

/nbstu01/app/oracle/diag/rdbms/nbstest/NBSTEST/trace/NBSTEST_ora_9699378.trc的内容为如下所示:

从上述显示内容中我们可以看出,现在索引IDX_T2有如下这三个分支块:

我们现在直接来dump上述分支块0x38003c6,dump后的trace文件内容为如下所示:

先来看上述显示内容中的第9行记录:

上述第9行记录所在叶子块的起止地址为0x380028f:

上述叶子块的dump内容为如下所示:

然后我们再来dump上述叶子块的前一个块(即kdxleprv 58720910=0x380028e);

也就是说上述第9行记录对应了两个索引行,这两个索引行恰好分布在两个叶子块中,一个在叶子块0x0380028f中,一个在叶子块0x380028e中

再来看上述分支块的dump内容中的第20行记录:

上述第20行记录所在叶子块的起始地址为0x380029a:

上述叶子块的dump内容为如下所示:

然后我们再来dump上述叶子块的前一个块(即58720921=0x3800299);

也就是说上述第20行记录对应了两个索引行,这两个索引行也恰好分布在两个叶子块中,一个在叶子块0x0380029a中,一个在叶子块0x03800299中

 

再来看上述分支块dump内容中的第230行记录:

因分析过程和结论和上述类似,这里略去。

col1记录的值为其ROWID头3个byte的实例

上述分支块的行记录所对应叶子块的dump内容为如下所示:

再来dump上述叶子块的前一个块:

这里上述叶子块的第一行记录所对应的ROWID为01 43 d1 fd 00 2b,其前一个叶子块的最后一行记录所对应的ROWID为01 43 d0 11 00 91,这两个ROWID的头3个byte分别为01 43 d1和01 43 d0,已然不同,所以上述分支块的行记录的col1只用记录01 43 d1就可以了。

col1记录的值为其ROWID头1个byte的实例

row#18[7464] dba: 184552472=0xb000c18

col 0; len 20; (20): 2f 31 62 39 34 37 31 65 38 5f 53 69 67 6e 61 74 75 72 65 31

col 1; len 1; (1): 0b

上述分支块的行记录所对应叶子块的dump内容为如下所示:

再来dump上述叶子块的前一个块:

这里上述叶子块的第一行记录所对应的ROWID为0b 00 0b 6a 00 57,其前一个叶子块的最后一行记录所对应的ROWID为01 43 d1 a7 00 06,这两个ROWID的头1个byte分别为0b和01,已然不同,所以上述分支块的行记录的col1只用记录0b就可以了。

常见问题

sys.undump存储过程的源码能否提供下?

create or replace procedure undump
(i_vc_input in varchar2) is
/*

功能: 将dump出来的16进制文本内容翻译成其原始文本,目前仅支持ZHS16GBK和AL32UTF8字符集
作者: dbsnake
创建日期:2010-11-30

输入参数:
i_vc_input: 输入的dump出来的16进制文本内容

输出参数:

输入输出参数:

调用到的存储过程:

sys.cdba()是否是系统自带的

不是,CDBA的源码如下:

关于oracle自定义外连接”(+)”
书中写的关于full outer join的等价改写:

您提到Oracle断然不会采用这样的等价改写,而是通过如下的改写:

通过这两种改写方式得到的结果是一致的,并查看了两种改写的执行计划,只是在第一种方式中多了union的排序操作,是因为这个原因吗?

排序只是union的副作用,这里为什么用union来模拟是因为我需要union所带来的“去重”

时间: 2024-11-03 16:10:09

深入剖析-Oracle索引分支块的结构的相关文章

Oracle 反向键索引的原理和用途(减少索引热点块)

Oracle 反向键索引的原理和用途(减少索引热点块) 我们知道Oracle会自动为表的主键列建立索引,这个默认的索引是普通的B-Tree索引.对于主键值是按顺序(递增或递减)加入的情况,默认的B-Tree索引并不理想.这是因为如果索引列的值具有严格顺序时,随着数据行的插入,索引树的层级增长很快.搜索索引发生的I/O读写次数和索引树的层级数成正比,也就是说,一棵具有5个层级的B -Tree索引,在最终读取到索引数据时最多可能发生多达5次I/O操作.因而,减少索引的层级数是索引性能调整的一个重要方

oracle 索引

在关系数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的SQL语句执行得更快.索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容.  对于数据库来说,索引是一个必选项,但对于现在的各种大型数据库来说,索引可以大大提高数据库的性能,以至于它变成了数据库不可缺少的一部分.   索引分类: 逻辑分类 single column or concatenated    对一列或多列建所引 unique or nonunique  唯一的和非唯一的所引,也就是对某一列或几列的键值(

Oracle索引(B*tree与Bitmap)的学习总结_oracle

在Oracle中,索引基本分为以下几种:B*Tree索引,反向索引,降序索引,位图索引,函数索引,interMedia全文索引等,其中最常用的是B*Tree索引和Bitmap索引.(1).与索引相关视图查询DBA_INDEXES视图可得到表中所有索引的列表:访问USER_IND_COLUMNS视图可得到一个给定表中被索引的特定列.(2).组合索引概念当某个索引包含有多个已索引的列时,称这个索引为组合(concatented)索引.注意:只有在使用到索引的前导索引时才可以使用组合索引(3).B*T

oracle索引介绍(图文详解)_oracle

对于数据库来说,索引是一个必选项,但对于现在的各种大型数据库来说,索引可以大大提高数据库的性能,以至于它变成了数据库不可缺少的一部分. 索引分类:逻辑分类single column or concatenated  对一列或多列建所引unique or nonunique 唯一的和非唯一的所引,也就是对某一列或几列的键值(key)是否是唯一的.Function-based  基于某些函数索引,当执行某些函数时需要对其进行计算,可以将某些函数的计算结果事先保存并加以索引,提高效率. Doman 

Oracle索引分裂(Index Block Split)

Oracle索引分裂(Index Block Split) 索引分裂:index  block split : 就是索引块的分裂,当一次DML 事务操作修改了索引块上的数据,但是旧有的索引块没有足够的空间去容纳新修改的数据,那么将分裂出一个新的索引块,旧有块的部分数据放到新开辟的索引块上去. 分裂的类型:根节点分裂,分支节点分裂,叶节点分裂(最频繁发生,对性能影响最直接) 按照数据迁移量的比例,将索引分裂分为两种类型:9-1分裂和5-5分裂. 9-1分裂:绝大部分数据还保留在旧有节点上,仅有非常

ORACLE索引组织表讨论

本文只代表作者观点,如有错误请指正 关于索引组织表本文主要讨论以下几个方面 1.什么是索引组织表 2.索引组织表的关键特性 3.如果建立一个合适的索引组织表 4.什么事逻辑ROWID以及物理猜(Physical Guesses) 5.从内部结构进行分析和证明这些观点 一般的情况下索引是和表分离的SEGMENT,索引的行记录的是索引键值和ROWID,而在索引组织表中就整个表就是一个索引,索引的页节点记录的并非 键值和ROWID而记录是整个数据行,这里和MYSQL INNODB的表非常相像,MYSQ

[20150321]索引空块的问题.txt

[20150321]索引空块的问题.txt --晚上看了: 索引空块较多造成index range scan的IO成本较高 http://www.dbaxiaoyu.com/archives/2504 --感觉有点怪怪的: SELECT /*+gather_plan_statistics ab*/ LOG.OID              OID, LOG.REGION           REGION, LOG.ACCEPT_SEQ       ACCEPT_SEQ, LOG.PROCESS_

oracle 索引压缩

  oracle 索引压缩     oracle 索引压缩(key compression)是oracle 9i 中引入的一项新特性.该特性可以压缩索引或者索引组织表中的重复键值,从而节省存储空间.非分区的unique 索引和non-unique(至少两列)索引都能够被压缩.bitmap 索引不能够进行压缩.      在oracle 索引压缩中有几个比较纠结的术语,需要说明一下.索引压缩是通过将索引中的键值拆分成两部分实现的,也就是grouping piece 也称作prefix 和 uniq

大数据-Oracle索引不生效是什么情况

问题描述 Oracle索引不生效是什么情况 原本的表没有设置索引,数据大约是5000多W.后来因为查询性能太差,决定优化,准备在某个唯一列上建一个索引.首先从原表导了1500W数据进行测试,测试时不加索引查一条记录大约一分钟.后来加了个Normal索引,查询时间在2秒以内,觉得很满意,所以按照相同结构又建了个表,用的一样的数据,准备再试验一次,查了查,确实慢,遂也给加上Normal索引,但是这回查询性能没变化了...怎么查都是一分钟左右.谁能给我讲讲为什么???