索引是一种允许直接访问数据表中某一数据行的树型结构,为了提高查询效率而引入,是一个独立于表的对象,可以存放在与表不同的表空间中。索引记录中存有索引关键字和指向表中数据的指针(地址)。对索引进行的I/O操作比对表进行操作要少很多。索引一旦被建立就将被Oracle系统自动维护,查询语句中不用指定使用哪个索引。

分类可以按逻辑设计和物理实现来分类。

索引逻辑分类

单列索引:基于一列的操作

多列索引:组合索引,最多为32列。组合索引的列不一定与表中列顺序相同。

惟一索引:列的值各不相同。

非惟一索引:列的值允许相同。

基于函数的惟一索引:利用表中一列或多列基于函数表达式所创建的索引。既可以是B-树,也可以是位图索引。

索引物理分类

分区或非分区索引,非分区既可以是B-树,也可以是位图索引。

B-树:包括正常或反转关键字索引,反转关键字在数据库优化中介绍。

位图索引

B-树索引

索引的存储方式

虽然所有索引都使用 B 树结构,但术语“B 树索引”通常与存储每个关键字的行标识列表的索引关联。

B 树索引结构

至上而下,是根结点、分枝结点及叶子结点,叶子结点中有指向表中数据行的索引行。叶子结点被双向链表在一起,以方便按索引关键字升序或降序扫描。

索引的顶部为根,其中包含指向索引中下一级的项,下一级为分枝块,分枝块又指向索引中下一级的块,最低一级为叶节点,其中包含指向表行的索引项。叶块为双重链接,有助于按关键字值的升序和降序扫描索引。

索引项叶节点的格式

索引项由以下三部分组成:

  • 项标题(entry header),存储列数和锁定信息
  • 关键字列的“长度- 值”(length-value pairs) ,必需成对出现,定义了列长度,紧跟在列长度之后的就是列的值。
  • 行的行标识(RowID), 包含关键字值。

索引项叶结点的特征

在非分区表上的 B 树索引中:

  • 如果多行具有相同的关键字值,并且索引没有被压缩,则关键字值重复存放。
  • 没有索引项与所有关键字列都为 NULL 的行对应,即如果某列值为Null,则不存储相应的索引项。如果Where子句中索引的所在列值为null,Oracle将不使用索引进行全表扫描。
  • 因为所有行都属于同一段,所以使用受限行标识指向表中的行,使用RowID可以节省索引存储空间。

DML 操作对索引的影响

当在表上执行 DML 操作时,Oracle 服务器将自动维护所有的索引,下面解释 DML命令对索引的影响:

  • 插入(Insert)操作导致在适当的块中插入索引项。
  • 删除(Delete)行只导致逻辑删除索引项,删除的行所用的空间不能用于新项,直到删除块中的所有项。
  • 更新(Update)操作将选删除,再插入,除了在创建时,其它任何时候PCTFREE 设置对索引都没有影响,即使索引块空间少于 PCTFREE 指定的空间,仍可以向索引块添加新项。

位图索引也是一种B树,但叶子结点存的不是RowID,而是每一个键值的位图。

当表包含数百万行且关键字列的基数低时——即该列有非常少的独特值。例如,对包含护照记录的表的性别列和婚姻状况列,位图索引比 B 树索引更适合。

  • 当查询经常使用涉及 OR 运算符的多个 WHERE 条件组合时。
  • 当关键字列上存在只读或很少的更新操作时。

位图索引的结构

位图索引也可以组织为 B 树,但叶节点存储每个关键字值的位图而非行标识列表,位图中的每一位对应一个可能的行标识(RowID),如果设置了位,则意味着具有相应行标识的行包含关键字值。

如图所示,位图索引的叶节点包含下列几项:

  • 项标题(entry header), 包含列数和锁定信息
  • 关键字值(key values)由每个关键字列的 length-value 双值组成,(本例中,关键字仅包含一列,第一项的关键字值为 Blue)
  • 开始行标识(Start RowID),本例中的开始行标识包含文件号 3 ,块号 10, 行号 0
  • 结束行标识(End RowID),本例中的结束行标识包含块号 12 和 1 行号 8
  • 位图段 由位串组成(对应的行包含关键字值时设置位,不包含关键字值时不设置位,Oracle 服务器使用专利压缩技术存储位图段。)

开始行标识是位图的位图段所指向的第一行的行标识——即,位图的第一位对应此行标识,位图的第二位对应块中的下一行,而结束行标识是位图段所包含的表中最后一行的指针,位图索引使用受限行标识。

使用位图索引

B 树用于定位包含给定关键字值的位图段的叶节点,开始行标识和位图段用于定位包含关键字值的行。当更改表中的关键字列时,必须修改位图,这将导致锁定相关的位图段,由于锁是在整个位图段上获取的,位图包含的行直到第一个事务结束后才能由其它事务更新。

位图所使用的存储空间比B树小得多,通常情况下,Oracle将位图索引段装入到内存中,内存的速度是远大于磁盘空间操作的速度的。此外,进行And与Or等逻辑操作时,Oracle使用的是位操作,所以执行效率也很快。

Oracle索引原理相关推荐

  1. oracle b树索引原理,Oracle索引原理精简总结

    尝试用最少的字数介绍oracle的几种常用索引原理,主要是想简单分析其存储结构来说明其检索方式,和解释为什们某种索引使用与某种场合.(数据结构中最简单的ArrayList和LinkedList的使用场 ...

  2. oracle索引对模糊查询,Oracle索引

    一.Oracle索引原理 通俗易懂得讲,索引就是给每条记录建立了一个目录(索引), 每个建立的索引都是按照这个索引的字段去排序(实际未必是排序)存放, 然后按照索引字段去查询的时候,就先去查询索引,此 ...

  3. mysql bitmap index_位图索引:原理(BitMap index)

    位图(BitMap)索引 前段时间听同事分享,偶尔讲起Oracle数据库的位图索引,顿时大感兴趣.说来惭愧,在这之前对位图索引一无所知,因此趁此机会写篇博文介绍下位图索引. 1. 案例 有张表名为ta ...

  4. Oracle索引详解(索引的原理,创建索引,删除索引,修改索引等)

    Oracle索引详解 一.索引概述 Oracle作为关系型数据库,用户查找数据与行的物理位置无关,表中的每一行均用一个ROWID来标识,当Oracle数据库中存储海量的记录时,就意味着有大量的ROWI ...

  5. Oracle加数据库索引原理

    使用索引很简单,只要能写创建表的语句,就肯定能写创建索引的语句,要知道这个世界上是不存在不会创建表的服务器端程序员的.然而, 会使用索引是一回事, 而深入理解索引原理又能恰到好处使用索引又是另一回事, ...

  6. 索引名 oracle,ORACLE 索引名称矫情

    oracle 索引英文名称很多,翻译过来的话也很多中文名称,不过总得来说词不达意.也就是说讲中文的时候,对方无法理解你说的是啥意思,啥情况,啥原理. 比如前缀,非前缀.本地和全局,普通和分区.B树和位 ...

  7. ORACLE工作原理小结

    ORACLE工作原理1-连接 我们从一个用户请求开始讲,ORACLE的完整的工作机制是怎样的,首先一个用户进程发出一个连接请求,如果使用的是主机命名或者是本地服务命中的主机名使用的是机器名(非IP地址 ...

  8. oracle INS-40930,Oracle 并行原理深入解析及案例精粹

    Oracle 并行原理深入解析及案例精粹 [日期:2012-08-12] 来源:Linux社区 作者:Leonarding [字体:大 中 小] (12)sqlload直接加载对索引的影响 所谓对索引 ...

  9. 【图文动画详解原理系列】1.MySQL 索引原理详解

    MySQL简介 MySQL是一个开放源代码的关系数据库管理系统.原开发者为瑞典的MySQL AB公司,最早是在2001年MySQL3.23进入到管理员的视野并在之后获得广泛的应用.2008年MySQL ...

  10. Oracle索引和事务

    Oracle索引和事务 1. 什么是索引?有什么用? 1.索引是数据库对象之一,用于加快数据的检索,类似于书籍的目录.在数据库中索引可以减少数据库程序查询结果时需要读取的数据量,类似于在书籍中我们利用 ...

最新文章

  1. AI时代即将出现的3个热门职业
  2. 在eclipse中开发servlet流程
  3. 计算机硬件市场调查清单,微型计算机组装与维护实用教程王际川第8章节组装计算机.ppt...
  4. RHEL 5服务篇—使用Apache搭建Web服务(一)
  5. 消防荷载楼板按弹性还是塑性计算_现浇楼板裂缝处理办法全总结!
  6. Count Subrectangles CodeForces - 1323B(思维)
  7. Zookeeper 使用
  8. 前端实现可绘制的canvas画布_前端图形学基础(五)——Canvas状态管理
  9. Vue Webpack常见问题(持续更新)
  10. java写七彩文字_【PS精选案例教程】创建一个漂亮的七彩文字
  11. OpenShift 4.10 不可变新特性 - 利用 MachineConfig 发现节点配置漂移
  12. scpi指令转换c语言,[C#源代码]使用SCPI指令对通讯端口(RS232/USB/GPIB/LAN)进行仪器编程...
  13. 【数据结构】顺序存储结构
  14. 2 一个完整的计算机系统包括,一个完整的计算机系统应包括.doc
  15. 如何用C++开发STM32?
  16. 笨鸟Linux学习连载之 - 万事开头难
  17. Python实训报告:学生信息管理系统
  18. 为什么焊锡焊出来的焊点不光亮
  19. 使用TASSEL学习GWAS笔记(3/6):基因型数据可视化:kingship,PCA,MDS
  20. 代码敲累了,停一下,来欣赏下顶级配色~

热门文章

  1. python股票交易模型_利用python建立股票量化交易系统(一)——小市值选股票模型...
  2. 用ie浏览器签章后保存在桌面显示不出文件
  3. brctl 设置ip_Linux 网桥配置命令:brctl
  4. 威联通建php邮件服务器_威联通 ※ 群晖 虚拟机性能对比 我可能要碰瓷 eSir
  5. 启动mongodb时发现错误libcrypto.so.10
  6. python之使用pyaudio录音和格式转化
  7. mac 蓝牙 串口调试 助手(工具)
  8. 移动端---媒体查询
  9. docker 安装 Redis5.X
  10. 计算机屏幕坐标系转换,测量坐标系到计算机屏幕坐标系的换算