`
liwenshui322
  • 浏览: 511015 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle B*树索引

阅读更多

 

       B*树索引就是我们说的“传统”索引,这是数据库中最常用的一类索引结构。其实现与二叉查找树类似,目标是减少oracle查找数据的时间。如果在一个数字列上有一个索引,那么理论上结构应该是这样的:



        这个树最底层是叶子节点,包含索引键以及一个rowid(指向索引行)。叶子节点上面的称为分支块,用于在结构中实现导航。例如:想在索引中找到值42,从树顶开始查找,进入左分支,查找这个块,发现需要找的数据在“42...50”的叶子节点中。

        另外,叶子节点之间是双向链表结构。也就是查找区间数据很容易,比如这样的条件,where x between 20 and 300。oracle只要刚开始找到大于或等于20的记录所在的叶子节点,接着往下扫描,找到大于或者等于300的块。这期间可能会跨叶子节点扫描,由于叶子节点之间是双向链表,故很容易实现跨叶子节点扫描。

       B*树有一个特点:所有的叶子节点都在同一层,也就是无论你查找哪一条数据,需要执行的I/O数据是一样的。一般的B*树都是2或者3层。无论这个表有多少行数据,这样查找一条数据只需要2,3个I/O操作。

 

      索引键压缩

      假如一个表中,需要三列才能确认一行。那么我们在这个表示建立索引需要建立在这三列上。那么索引块的结构有可能是这样的,


                               
       我们会发现,第一列和第二列有很多值是重复的。其实这个时候可以进行压缩,对于重复的值,只保存一份。比如:

 

drop index t_idx;
create index t_idx on
t(owner,object_type,object_name)
compress &2;

       compress&2表示压缩两列,这样能节省空间,但是会增加寻找的难度。也就是说,如果现在已经占用了大量的cpu时间,那么创建索引以压缩的方式,会使情况更糟糕。如果目前只是I/O操作比较多,那么压缩索引能加快处理速度,因为压缩之后的索引空间更少,那么块缓冲区应该能存放更多的索引块,块的命中率会提高。

 

      反向键索引

      假如我们建立的所有是在一个递增的列上,从上面的图1索引结构图,可以看出,相邻的值保存在同一索引块上。那么我们批量递增插入数据的时候,就会引起索引块的竞争。但是如果我们把索引值反转之后,原先相邻的值,就会相差很远,这样就降低了索引块的竞争。

      反向索引有一个缺点,无法进行区间扫描。因为索引值已经反转,索引值相邻的值都是反转之后相邻的值,实际值其实相差很远,区间扫描无法进行。

      那么,假设我们需要一个表,有一个主键是递增的,而且今后也不会在这个主键上进行区间扫描。但是有大批量的插入,这个时候就适合建立一个反向键索引。

 

      B*树使用情况

      什么时候应该使用B*树索引,什么时候又不行呢?主要看两点:

      1. 当需要通过索引访问表中很少一部分数据的时候,可以建立B*树索引。

      2. 即使需要访问表中多行,但是能只访问索引解决,也可以建立B*树索引。比如select count(*) from ...。

 

      为什么只有访问少量数据的时候,才能使用B*树索引呢,举一例子:

      假设我们通过索引读取一个表,而且要读取表中20%的行。若这个表中有100,000行,其中的20%就是20,000行。如果行大小约为80字节,在一个块大小为8KB的数据库中,每个块上则有大约100行。这说明,这个表有大约1000个块。了解了执行情况,计算起来就非常容易了。我们要通过索引读取20,000行;这说明,大约是20,000个TABLE ACCESS BY ROWID操作。为此要处理20,000个表块来执行这个查询。不过,整个表才有大约1000个块!最后会把表中的每一个块读取好处理20次。即使把行的大小提高一个数量级,达到每行800字节,这样每块有11.行,现在表中就有11.,000个块。要通过索引访问20,000行,仍要求我们把每一个块平均读取2次。还没有全表扫描块,全表扫描每一块只需访问一次。

 

      物理组织

      数据在磁盘上如何物理地组织,对上述例子有显著影响。如果那个索引的主键是按递增的方式存储在磁盘,那么上述例子的情况完全会不同,读取2W行数据完全不需要读取2W次块。读取一次块,即把这一块的数据读取到了缓存,这一块上符合条件的数据有很多,可能基本上都是想要的,那么相当于读一次块就读到了100行数据,我们需要2W行数据,那么读取200次块左右,而不是上述例子中的2W次块。上述例子是极限情况,上行数据和下一行数据都不在同一块上。

       刚刚说的,读一次块就读了100行到缓存,其实有一个前提条件,前提是设置一个参数为100,。到oracle块读取数据的时候,有一个参数,代表一次读取多少行,叫做ARRAYSIZE。在java/jdbc中,connect或者statement对象有一个prefetch方法,代表一次读取多少行。假设设置成100,读取第一行的时候找到第一行所在的数据块读取,接着就开始读取第二行,这个时候发现第二行也在这个块上,于是直接就取了。接着就读取剩下的98行,直到读完100行数据。假设100行都在这个块上,那么只有一次I/O操作。也就是上面所说的一次读取了100行到缓存。但是假设那个参数设置的是10,那么相当于要读取10次,也就是同一个块要读取10次,才能获得100行数据。可见这个参数的设置是相当重要的。

 

 

 

 

 

  • 大小: 34.7 KB
  • 大小: 20.8 KB
分享到:
评论

相关推荐

    Oracle B*树索引内部机制及其应用的研究.pdf

    Oracle B*树索引内部机制及其应用的研究.pdf

    OracleB_树索引内部机制及其应用的研究

    Oracle数据库应用系统的性能优化是一项系统化的工程,涉及到数据库结构的各个方面。本文从B* 树索引入手, 分析了B* 树索引的结构及原理,阐明了如何正确合理地使用B* 树索引及其如何优化数据库系统的性能。

    B树索引的研究

    Oracle 索引研究

    oracle 三种索引

    oracle 三种索引的简单描述,位图、B树、全文索引。

    oracle使用索引与不使用索引的性能详析

    Oracle存储索引的数据结构是B*树。位图索引也是如此,仅仅只是是叶子节点不同B*数索引; 索引由根节点、分支节点和叶子节点组成。上级索引块包括下级索引块的索引数据,叶节点包括索引数据和确定行实际位置的rowid。...

    Oracle关于重建索引争论的总结

    索引重建是一个争论不休被不断热烈讨论的议题。... a、Oracle的B树索引随着时间的推移变得不平衡(误解)  b、索引碎片在不断增加  c、索引不断增加,删除的空间没有重复使用  d、索引 clustering factor (集群因

    Oracle数据库,索引的相关知识

    1)B树索引(考点):是应用最广泛的索引,也是Oracle数据库的默认索引类型。B树指的是平衡树(Balanced Tree),它是使用平衡算法来管理索引的。 适合B树索引的场合有: 表中存储的数据行数很多。 列中存储的数据的

    ORACLE检查找出损坏索引(Corrupt Indexes)的方法详解

    索引 索引与表一样,也属于段...从物理上说,索引通常可以分为:分区和非分区索引、常规B树索引、位图(bitmap)索引、翻转(reverse)索引等。其中,B树索引属于最常见的索引。 引言 本文主要给大家介绍了关于ORAC

    Oracle 11g Release (11.1) 索引底层的数据结构

    非索引的结构能满足所有需要,但自平衡的 B-树索引结构更能优化在大数据集上检索的性能。每个 B-树节点拥有多个键和指针。特定 B-树支持的一个节点中键的最大数量是那颗树的顺序。每个节点都具有一个潜在的 order+1 ...

    Oracle 9i&10g编程艺术:深入数据库体系结构(全本)含脚本

    11.2.4 什么情况下应该使用B*树索引? 437 11.2.5 B*树小结 448 11.3 位图索引 448 11.3.1 什么情况下应该使用位图索引? 449 11.3.2 位图联结索引 453 11.3.3 位图索引小结 455 11.4 基于函数的索引 456 ...

    Bitmap索引

    B树索引是数据库中使用最多的索引,在数据量不太大时,它几乎就是索引的代名词。换句话说,在这种环境下,当人们说创建一个索引时,通常指的就是B树索引。当数据量不太大(比如几百万条记录以下)时,B树索引几乎...

    oracle 索引的相关介绍(创建、简介、技巧、怎样查看) .

    一、索引简介 1、索引相当于目录 2、索引是通过一组排序后的索引键来取代默认的全表... 单列索引和复合索引 b.B树索引(create index时默认的类型) B树索引中所有叶子节点都具有相同的深度,所以不管查询条件如何,查

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。  拉里•埃里森  就业前景 从就业与择业的...

    ORACLE9i_优化设计与系统调整

    §13.2.3 使用B树索引- 166 §13.2.4 使用反向键索引- 166 §13.2.5 使用索引组织表 166 §13.3 使用范围索引 166 §13.4 使用簇 - 167 §13.5 使用Hash 簇 - 168 §13.5.1 何时创建Hash 簇 168 §13.5.2 创建Hash ...

    ORACLE教材

    B树索引(默认) 位图索引 函数索引 视图 序列 利用OEM操作 第九章:备份与恢复 脱机备份与恢复 联机备份与恢复 逻辑备份与恢复 第十章:sqlplus基础 设置SQL*PLUS的运行环境 格式化查询命令 第十一...

    oracle10g课堂练习I(1)

    B 树索引 7-28 位图索引 7-30 索引选项 7-32 创建索引 7-34 什么是视图 7-35 创建视图 7-36 序列 7-37 创建序列 7-38 使用序列 7-40 临时表 7-41 临时表:注意事项 7-43 数据字典:概览 7-44 数据字典...

    Oracle DBA workshop1 (中文版)

    前言 1 简介 课程目标1-2 建议日程表1-3 课程目标1-4 Oracle 产品和服务1-5 Oracle Database 10g:“g...B 树索引7-28 位图索引7-30 索引选项7-32 创建索引7-34 vi 什么是视图7-35 创建视图7-36 序列7-37 创建序列7-38

Global site tag (gtag.js) - Google Analytics