oracle树状索引详解(图摘取《收获不止oracle》)

一.树状索引特点

1.高度较低

2.存储列值

3.结构有序

我们先看一下索引的结构,如图:

以上结构图说明索引是由 ROOT(根块),Branch(茎块)和Leaf(叶子块)三部分组成的,其中最底层的叶子块 主要存储了 key column value(索引列具体值),以及能具体定位到数据所在位置的rowid(此处rowid和查询时候用的rownum不是同一个概念,有兴趣可以百度rownum和rowid的区别)

注意点:索引块和数据块 需要区分,索引块也是占磁盘空间的

二.oracle索引查询

索引是如何快速检索到数据的呢?

举个书上的例子:select * from test where id = 12;
假如该test表共有10050条数据,而id=12仅返回一条数据,test表id字段建了一个索引,检索数据如下图:

   通过图片理解,该sql语句大致只要3个IO,此处是个例子,实际情况1w多数据量,索引高度应该只有2层,即2个IO左右。

  首先查询定位到索引根部,接下来根据根块数据分布,定位到茎部数据,然后定位到叶子块。

  有了索引,oracle只会去扫描部分索引块,而非全部,所以会提高性能。由于是select * 语句,不止只要id这个字段,所以不止要扫描索引块,还要根据 这个id=12的索引中的rowid,去回表扫描其他字段,所以要加上一次IO。

  数据库IO:连续读,随机读,随机写和连续写

三.索引高度和结构的理解

索引并不是真的就是根茎叶3层,索引高度是根据数据量来体现的。

1.索引建立的步骤

还是test表,有id等列,现在在id上建立索引,

1)先从test表的id列的值顺序取出来放在内存中,每个值对应的rowid也被一并取出。

2)依次将内存中顺序存放的列的值和对应的rowid存进oracle空闲的BLOCK中,形成了索引块,步骤如下图:

步骤总结:

1.要建索引先排序 ,所以索引其实是有序的

2.列值入块成索引,索引块就是这么来的

3.填满一块接一块,数据量增大在索引的体现,就是叶子块横向扩展

4.同级两块需人管,叶子块有2个或以上时候,就需要有一个老大来管理多个叶子块,这个老大块里放的是没个叶子块的指针,所以索引的高度不容易变得特别大也是这个道理

由此,也可以得到索引的三大特点:

验证以上理论,可以根据书上例子自己本地试验一下,

可以通过执行计划看一下索引高度相同的表的查询语句,是不是耗费成本一样,因为产生IO次数一样;而索引高度再高,根据索引去查询数据,也就多了几次IO,速度也是很快(在例子中,查询只返回一条的情况下)

为什么索引建立的时候,要选择选择率高的字段,比如一个表只有几个状态,不应该建索引?

根据以上理论,可以知道,如果10w数据根据索引查询出有5w,IO次数相当于5w*3次IO,

而全表扫描是远远没有那么多的,就算一条一条扫描也最多10w,更不用说全表扫描,一次可以扫多个数据块了。

原文地址:https://www.cnblogs.com/wangchuanjie/p/9225541.html

时间: 2024-08-01 09:47:57

oracle树状索引详解(图摘取《收获不止oracle》)的相关文章

BIT 树状数组 详解 及 例题

(一)树状数组的概念 如果给定一个数组,要你求里面所有数的和,一般都会想到累加.但是当那个数组很大的时候,累加就显得太耗时了,时间复杂度为O(n),并且采用累加的方法还有一个局限,那就是,当修改掉数组中的元素后,仍然要你求数组中某段元素的和,就显得麻烦了.所以我们就要用到树状数组,他的时间复杂度为O(lgn),相比之下就快得多.下面就讲一下什么是树状数组: 一般讲到树状数组都会少不了下面这个图: 下面来分析一下上面那个图看能得出什么规律: 据图可知:c1=a1,c2=a1+a2,c3=a3,c4

高级数据结构:优先队列、图、前缀树、分段树以及树状数组详解

优秀的算法往往取决于你采用哪种数据结构,除了常规数据结构,日常更多也会遇到高级的数据结构,实现要比那些常用的数据结构要复杂得多,这些高级的数据结构能够让你在处理一些复杂问题的过程中多拥有一把利器.同时,掌握好它们的性质以及所适用的场合,在分析问题的时候回归本质,很多题目都能迎刃而解了. 这篇文章将重点介绍几种高级的数据结构,它们是:优先队列.图.前缀树.分段树以及树状数组. 一.优先队列 1.优先队列的作用 优先队列最大的作用是能保证每次取出的元素都是队列中优先级别最高的,这个优先级别可以是自定

树状数组详解(图形学算法)

目录 一.从图形学算法说起 1.Median Filter 概述 2.r pixel-Median Filter 算法 3.一维模型 4.数据结构的设计 5.树状数组华丽登场 二.细说树状数组 1.树 or 数组? 2.结点的含义 3.求和操作 4.更新操作 5.lowbit函数O(1)实现 6.小结 三.树状数组的经典模型 1.PUIQ模型 2.IUPQ模型 3.逆序模型 4.二分模型 5.再说Median Filter 6.多维树状数组模型 四.树状数组题集整理 一.从图形学算法说起 1.M

Oracle中的索引详解

Oracle中的索引概述 索引与表一样,也属于段(segment)的一种.里面存放了用户的数据,跟表一样需要占用磁盘空间.索引是一种允许直接访问数据表中某一数据行的树型结构,为了提高查询效率而引入,是一个独立于表的对象,可以存放在与表不同的表空间中.索引记录中存有索引关键字和指向表中数据的指针(地址).对索引进行的I/O操作比对表进行操作要少很多.索引一旦被建立就将被Oracle系统自动维护,查询语句中不用指定使用哪个索引. 从物理上说,索引通常可以分为:分区和非分区索引.常规B树索引.位图(b

树状数组详解

一.引入和概念 平常我们会遇到一些对数组进行维护查询的操作,比较常见的,修改某点的值.求某个区间的和. 数据规模不大的时候,对于修改某点的值是非常容易的,复杂度是O(1),但是对于求一个区间的和就要扫一遍了,复杂度是O(N). 如果实时的对数组进行M次修改或求和,最坏的情况下复杂度是O(M*N),当规模增大后这是划不来的. 而树状数组干同样的事复杂度却是O(M*lgN). 树状数组是一个查询和修改复杂度都为log(n)的数据结构. 主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素

Oracle中的索引详解(转载)

一. ROWID的概念 存储了row在数据文件中的具体位置:64位 编码的数据,A-Z, a-z, 0-9, +, 和 /, row在数据块中的存储方式 SELECT ROWID, last_name FROM hr.employees WHERE department_id = 20; 比 如:OOOOOOFFFBBBBBBRRR OOOOOO:data object number, 对应dba_objects.data_object_id FFF:file#, 对应v$datafile.fi

[转]Oracle中的索引详解

原文地址:http://www.oschina.net/question/30362_4057 一. ROWID的概念 存储了row在数据文件中的具体位置:64位 编码的数据,A-Z, a-z, 0-9, +, 和 /, row在数据块中的存储方式 SELECT ROWID, last_name FROM hr.employees WHERE department_id = 20; 比 如:OOOOOOFFFBBBBBBRRR OOOOOO:data object number, 对应dba_o

Oracle索引详解

Oracle索引详解(一) ### --索引介绍 ??索引对于Oracle学习来说,非常重要,在数据量巨大的状况下,使用恰到好处的索引,将会使得数据查询时间大大减少,于2017/12/25暂时对Oracle中的索引进行一个大致的了解. 索引的创建语法 索引的特点 索引的不足 比较适合建立索引的列的特点 不适合建立索引的列的特点 限制索引(建立了索引,但是无法使用) 查询索引 组合索引 Oracle rowid 选择性 群集因子 二元高度 快速全表扫描 跳跃式扫描 索引的创建语法 create o

[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日之功) 继上四篇:ORACLE PL/SQL编程之八:把触发器说透                ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)                [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]