Oracle数据库索引:深入理解原理图 (oracle数据库索引原理图)

在数据库中,索引是指用于快速访问数据的数据结构,它允许数据库服务器有效地查找特定条件下的数据行。随着数据库中数据量的增加,索引的作用越来越重要。Oracle数据库是一种常见的企业级关系型数据库管理系统,其索引机制也非常成熟。本文将从原理图的角度深入探讨Oracle数据库索引的原理和应用。

一、索引的分类

在Oracle数据库中,索引可以分为以下两类:

1. 唯一索引:唯一索引指标识表中每个数据行的属性值都是唯一的。对于唯一索引,数据库系统在索引中保存的是数据行的地址,以实现对数据行的快速访问。

2. 非唯一索引:非唯一索引指表中不同的数据行可以拥有相同的属性值。在非唯一索引中,数据库系统会保存多个数据行的地址。

二、Oracle数据库索引的实现原理

在Oracle数据库中,索引实际上是一个B树结构。B树是一种平衡树,通过在节点中存放多个数据行的地址,可以实现对数据行的快速访问。B树的平衡性可以保证在索引中查找数据时的效率。此外,B树的根节点和所有叶节点的深度相同,因此对于任何查询条件,查找时间始终保持对数的级别。

三、Oracle数据库索引的应用

在Oracle数据库中,索引可以应用到以下几个方面:

1. 提高查询效率:在查询大型表中的数据时,使用索引可以大大提高查询效率。通过基于索引来查找数据行,可以避免在整个表中扫描数据行的情况,从而节省查询时间。

2. 加速排序:Oracle数据库可以利用索引来加速排序操作。当需要按照某个属性值对表中数据行进行排序时,Oracle数据库会在属性值上建立索引,并利用这个索引来实现排序操作。

3. 唯一性检查:在Oracle数据库中,唯一索引可以用来检查属性值的唯一性。当插入一条新数据行时,数据库系统会检查新数据行的属性值是否与已经存在的数据行的属性值相同。如果属性值已经存在于索引中,数据库系统就会拒绝插入这条数据行。

4. 建立约束:在Oracle数据库中,索引可以用来建立约束。例如,设置唯一索引可以强制表中每个数据行的属性值是唯一的,这样可以保证不会出现重复数据。

四、Oracle数据库索引的优化

针对Oracle数据库索引的优化,可以从以下几个方面进行考虑:

1. 选择合适的索引类型:在创建索引时,应选择合适的索引类型。如果表中某个属性的取值较为唯一,应当使用唯一索引来确保属性值的唯一性。如果属性值分布比较均匀,就应当使用非唯一索引来提高索引的效率。

2. 合理的索引列数量:在创建索引时,应避免创建过多的索引列。如果索引列数量过多,就容易影响数据库的执行效率。

3. 定期维护索引:应当定期维护索引,包括对索引进行重建和重新统计。重建索引可以优化索引的存储结构和使用效率,而重新统计索引可以保证Oracle数据库根据最新情况对索引进行优化。

4. 消除重复索引:在某些情况下,同一个表可能会存在多个索引,这些索引可能会有重复的部分。这种情况下,应当考虑删除其中部分索引,以避免出现冗余的索引结构。

五、

本文深入分析了Oracle数据库索引的原理和应用技巧。在数据量庞大的情况下,索引的作用非常明显。通过合理的索引设计和优化,可以大大提高数据库系统的性能。在这一点上,建议开发人员对Oracle数据库索引深入理解,以更好地利用索引机制来优化数据库性能。

相关问题拓展阅读:

oracle的索引有几种

Oracle 提供了多种不同类型的索引以供使用。简单地说, Oracle 中包括如下索引:

1、 B* 树索引

这些是我所说的 “ 传统 “ 索引。到目前为止,这是 Oracle 和大多数其他数据库中最常用的索引。 B* 树的构造类似于二叉树,能根据键提供一行或一个行集的快速访问,通常只需很少的读操作就能找到正确的行。不过,需要注意重要的一点, ” B* 树 “ 中的 ” B “ 不代表二叉( binary ),而代表平衡( b alanced )。B* 树索引并不是一颗配世腔二叉树,这一点在介绍如何在磁盘上物理地存储 B* 树时就会了解到。 B* 树索引有以下子类型:

索引组织表( index organized table ):索引组织表以 B* 树结构存储。堆表的数据行是以一种无组织的方式存储的(只要有可用的空间,就可以放数据),而 IOT 与之不同, IOT 中的数据要按主键的顺序存储和排序。对应培衫用来说, IOT 表现得与 “ 常规 “ 表并无二致;需要使用 SQL 来正确地访问 IOT 。 IOT 对信息获取、空间系统和 OLAP 应用最为有用。 IOT 在上一章已经详细地讨论过。

B*树聚簇索引( B*tree cluster index )这些是传统 B* 树索引的一个变体(只是稍有变化)。 B* 树聚簇索引用于对聚簇键建立索引(见第 11. 章中 “ 索引聚簇表 “ 一节),所以这一章不再讨论。在传统 B* 树中 ,键都指向一行;而 B* 树聚簇不同,一个聚簇键会指向一个块,其中包含与这个聚簇键相关的多行。

降序索引( descending index ):降序索引允许数据在索引结构中按 “ 从大到小 “ 的顺序(降序)排序,而不是按 ” 从小到大 “ 的顺序(升序)排序。我们会解释为什么降序索引很重要,并说明降序索引如何工作。

反向键索引( reverse key index ):这也是 B* 树索引,只不过键中的字节会 “ 反转 “ 。利用反向键索引,如果索引中填充的是递增的值,索引条目在索引中可以得到更均匀的分布。例如,如果使用一个序列来生成主键,这个序列将生成诸如、、等值。这些值是顺序的,所以倘若使用一 个传统的 B* 树索引,这些值就返仔可能放在同一个右侧块上,这就加剧了对这一块的竞争。利用反向键, Oracl e则会逻辑地对、、等建立索引。 Oracle 将数据放在索引中之前,将先 把所存储数据的字节反转,这样原来可能在索引中相邻放置的值在字节反转之后就会相距很远。通过反转字节,对索引的插入就会分布到多个块上。

2、 位图索引( bitmap index )

在一颗 B* 树中,通常索引条目和行之间存在一种一对一的关系:一个 索引条目就指向一行。而对于位图索引,一个索引条目则使用一个位图同时指向多行。位图索引适用于高度重复而且通常只读的数据(高度重复是指相对于表中的总行数,数据只有很少的几个不同值)。考虑在一 个有 100 万行的表中,每个列只有 3 个可取值: Y 、 N 和 NULL 。举例来说,如果你需要频繁地统计多少行有值Y ,这就很适合建立位图索引。不过并不是说如果这个表中某一列有 11.000 个不同的值就不能建立位图索引,这一列当然也可以建立 位图索引。在一个 OLTP 数据库中,由于存在并发性相关的问题,所以不能考虑使用位图索引(后面我们就会讨论这一点)。注意,位图索引要求使用 Oracle 企业版或个人版。

位图联结索引( bitmap join index ):这为索引结构(而不是表)中的数据提供了一种逆规范化的 方法。例如,请考虑简单的 EMP 和 DEPT 表。有人可能会问这样一个问题: “ 多少人在位于波士顿的部门工作 ?“ EMP 有一个指向 DEPT 的外键,要想统计 LOC 值为 Boston 的部门中的员工人数,通常必须完成表联结,将 LOC 列联结至 EMP 记录来回答这个问题。通过使用位图联结索引,则可以在 EMP 表上对 LOC 列建立索引 。

3、 基于函数的索引( function-based index )

这些就是 B* 树索引或位图索引,它将一个函数计算得到的结果存储在行的列中,而不是存储列数据本身。可以把基于函数的索引看作一个虚拟列(或派生列)上的索引,换句话说,这个列并不物理存储在表中。基于函数的索引可以用于加快形如 SELECT * FROM T W HERE FUNCTION(DATABASE_COLUMN) = SAME_VALUE 这样的查询,因为值 FUNCTION(DATABASE_COLUMN) 已经提前计算并存储在索引中。

4、 应用域索引( application domain index )

应用域索引是你自己构建和存储的索引,可能存储在Oracle 中,也可能在 Oracle 之外。你要告诉优化器索引的选择性如何,以及执行的开销有多大,优化器则会根据你提供的信息来决定是否使用你的索引。 Oracle 文本索引就是应用域索引的一个例子;你也可 以使用构建 Oracle 文本索引所用的工具来建立自己的索引。需要指出,这里创建的 “ 索引 “ 不需要使用传统的索引结构。例如, Oracle 文本索引就使用了一组表来实现其索引概念。

5、HASH索引

使用HASH索引必须要使用HASH群集。建立一个群集或HASH群集的同时,也就定义了一个群集键。这个键告诉Oracle如何在群集上存储表。在存储数据时,所有与这个群集键相关的行都被存储在一个数据库块上。若数据都存储在同一个数据库块上,并且使用了HASH索引,Oracle就可以通过执行一个HASH函数和I/O来访问数据——而通过适用一个二元高度为4的B-树索引来访问数据,则需要在检索数据时使用4个I/O。

技巧:HASH索引在有限制条件(需要指定一个确定的值而不是一个值范围)的情况下非常有用。

6、分区索引

分区索引就是简单地把一个索引分成多个片断,这样可以访问更小的片断,并且可以把这些片断分别存放在不同的硬盘上(避免I/O问题)。B-数索引和位图索引都可以被分区,HASH索引不可以被分区。

有两种类型的分区索引:本地分区索引和全局分区索引。每个类型都有两个子类型,有前缀索引和无前缀索引。如果使用了位图索引就必须是本地索引。

把索引分区最主要的原因是可以减少所需读取的索引的大小,另外把分区放在不同的表空间中可以提高分区的可用性和可靠性。

oracle sql优化涉及哪些原理

B 树索引(B-Tree索引)

  B树索引是我们在oracle数据库中最常用的索引,在详细介绍访问方法之前,我们看一下B-TREE索引的结构(图片来源网络)

  oracle的B树索引就好像一颗长到的树,他包含两种类型,一种是索引分支块(根节点块,分支节点块)一种是索引叶子块(叶子节点块)。分节点用来搜索,叶子节点用来存储数据。根节点存储索引的低层分支节点的数据。 由于所有的叶子节点均会自动的存储成相同的深度,所以称为“平 衡树索引”, 故此,从任何叶子处检索数据消耗的时间都是相同的。

  对于分支节点块(包括根节点块)来说,其所包含的索引条目都是按照顺序排列的(缺省是升序排列,也可以在创建索引时指定为降序排列)。每个索引条目(也可以叫做每条记录)都具有两个字段。之一个字段表示当前该分支节点块下面所链接的索引块中所包含的最小键值;第二个字段为四个字节,表示所链接的索引块的地址,该地址指向下面一个索引块。 比如从上图一可以看到,对于根节点块来说,包含三条记录,分别为(0 B1)、(500 B2)、(1000 B3),它们指向耐卖三个分支节点块。其中的0、500和1000分别表示这三个分支节点块所链接的键值的最小值。而B1、B2和B3则表示所指向的三个分支节点块的地址。在一个分支节点块中 所能容纳的记录 行数由数据块大小以及索引键值的长度决定。

  对于叶子节点块来说,其所包含的索引条目与分支节点一样,都是按照顺序排列的(缺省是升序排列,也可以在创建索引时指定为降序排列)。每个索引条目(也可以叫做每条记录)也具有两个字段。之一个字段表示索引的键值,对于单列索引来说是一个值;而对于多列索引来说则是多个值组合在一起的。第二个字段表示键值所对应的记录行的ROWID,该ROWID是记录行在表里的物理地址。

  当用户创建索引时,Oracle 取得所有被索引列的数据并进行排序,之后将排序后索引值和与此值相对应的 rowid 按照从下到上的顺序加载到索引中。例如,以下语句:

   view plain copy print?在CODE上查看代码片派生到我的代码片

  CREATE INDEX employees_last_name ON employees(last_name);

  Oracle 先将 employees 表按 last_name 列排序,再将排序后的 列及相应的 rowid 按从下到上的顺序加载到索引中。使用此索引时,Oracle 可以快速地搜索已排序的 last_name 值,并使用相应的 rowid 去定位包含用户所查找的 last_name 值的数据行。

  在一个平衡树索引中,更底层的索引块(叶块)存储了被索引的数据值,以及对应的

  rowid。叶块之间以双向链表的形式相互连接。位于叶块之上的分支块中包含了

  指向下层索引块的指针。

oracle数据库索引原理图的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于oracle数据库索引原理图,Oracle数据库索引:深入理解原理图,oracle的索引有几种,oracle sql优化涉及哪些原理的信息别忘了在本站进行查找喔。


数据运维技术 » Oracle数据库索引:深入理解原理图 (oracle数据库索引原理图)