Oracle 索引原理分析
索引是一种允许直接访问数据表中某一数据行的树型结构,为了提高查询效率而引入,是一个独立于表的对象,可以存放在与表不同的表空间中。索引记录中存有索引关键字和指向表中数据的指针(地址)。对索引进行的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使用的是位操作,所以执行效率也很快。
转自:http://blog.csdn.net/zhifeiyu2008/article/details/8309772
Oracle 索引原理分析的更多相关文章
- [转]Oracle 索引质量分析
http://blog.csdn.net/leshami/article/details/23687137 索引质量的高低对数据库整体性能有着直接的影响.良好高质量的索引使得数据库性能得以数量级别的提 ...
- 干货 MySQL常见的面试题 + 索引原理分析
常见的面试必备之MySQL索引底层原理分析: MySQL索引的本质 MySQL索引的底层原理 MySQL索引的实战经验 面试 1)问题:数据库中最常见的慢查询优化方式是什么? 回答:加索引 2)问题: ...
- Elasticsearch核心技术(四):索引原理分析
本文探讨Elasticsearch的数据请求.路由和写入过程的原理,主要涉及ES的分布式存储架构.节点和副本的写入过程.近实时搜索的原因.持久化机制等. 4.1 ES存储架构 我们经常说,看一件事情千 ...
- Elasticsearch-基础介绍及索引原理分析(转载)
最近在参与一个基于Elasticsearch作为底层数据框架提供大数据量(亿级)的实时统计查询的方案设计工作,花了些时间学习Elasticsearch的基础理论知识,整理了一下,希望能对Elastic ...
- 干货—MySQL常见的面试题+索引原理分析!
目录 MySQL索引的本质 MySQL索引的底层原理 MySQL索引的实战经验 面试 问:数据库中最常见的慢查询优化方式是什么? 同学A:加索引. 问:为什么加索引能优化慢查询? 同学A:...不知道 ...
- Elasticsearch-基础介绍及索引原理分析
介绍 Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 L ...
- 41.oracle索引,分析索引,索引碎片整理
概述 索引分为B树索引和位图索引.我们主要研究B树索引,B树索引如下图(图片源自网络):
- oracle索引原理(b-tree,bitmap,聚集,非聚集索引)
B-TREE索引 一个B树索引只有一个根节点,它实际就是位于树的最顶端的分支节点. 可以用下图一来描述B树索引的结构.其中,B表示分支节点,而L表示叶子节点. 对于分支节点块(包括根节点块)来说,其所 ...
- oracle索引原理
B-TREE索引(二叉树索引,默认情况下,我们建的索引都是此种类型) 一个B树索引只有一个根节点,它实际就是位于树的最顶端的分支节点.可以用下图一来描述B树索引的结构.其中,B表示分支节点,而L表示叶 ...
随机推荐
- STL——容器(deque) deque 的赋值 assign() operator=() swap()
deque 的赋值分下边4种方法: deque.assign(beg,end); //将[beg, end)区间中的数据拷贝赋值给本身.注意该区间是左闭右开的区间. 1 #include <io ...
- sqli-labs less-24(二次注入)
less-24 原理: 在网站处理用户提交的数据的时候,只是将某些敏感字符进行了转义.因而使得用户第一次提交的时候不会被当做代码执行.但是这些数据存入数据库的时候却没有转义,而网站程序默认数据库中的数 ...
- linux下postgresql安装
1.下载地址 https://www.enterprisedb.com/download-postgresql-binaries 2.创建用户并修改密码 [root@node01 ~]# userad ...
- 常见的 emit 实现 AOP demo
0. 前言 上接:思想无语言边界:以 cglib 介绍 AOP 在 java 的一个实现方式 作为第四篇,我们回顾一下 csharp 里面比较常见动态编织实现方式emit 内容安排如下: emit a ...
- C#数据结构-赫夫曼树
什么是赫夫曼树? 赫夫曼树(Huffman Tree)是指给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小.哈夫曼树(也称为最优二叉树)是带权路径长度最短的树,权值较大的结点 ...
- Golang--函数签名相同
Golang--函数签名相同 条件 必须函数的函数名,参数和返回值(类型,个数,顺序)都相同. 验证 例子: 定义函数类型,让相同签名的函数自动实现某个接口. Negtive: package int ...
- Docker部署tomcat+nginx+mysql,创建一个tomcat集群
Docker的部署可以选择虚拟机或者云服务器,我自己选择的是本机安装centos7虚拟机: 1.虚拟机安装登录成功后开始部署docker: 首先了解docker是一个开源应用容器引擎,基于Go语言遵循 ...
- C# 高并发、抢单解决思路
高并发 高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求.高并发相关常用的一些指标有响应时间(Respon ...
- C# 如何查询字符串前面有几个0
有几个0 string t = "0001203"; int tLen = t.Length - t.TrimStart('0').Length; charAt方法 using S ...
- 《Spring Boot 实战纪实》缺失的逻辑
目录 前言 (思维篇)人人都是产品经理 1.需求文档 1.1 需求管理 1.2 如何攥写需求文档 1.3 需求关键点文档 2 原型设计 2.1 缺失的逻辑 2.2 让想法跃然纸上 3 开发设计文档 3 ...