Oracle中索引的存储原理浅析

更新时间:2023-11-27 14:51:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Oracle中索引的存储原理浅析

霍俊伟 明廷堂

(河南大学网络信息中心 河南 开封 475001)

摘要:本文从原理的角度简要介绍了Oracle中和索引存储相关的参数以及索引存储的方法。 关键词:索引块; 索引段; 平衡树 1. 前言

在Oracle数据库中,当用户创建索引时,Oracle 会自动地在表空间中创建索引段来存储索引的数据。用户可以通过以下方式控制索引段的空间分配和使用:

设置索引段的存储参数来控制如何为此索引段分配数据扩展

为索引段设置 PCTFREE 参数,来控制组成数据扩展的各个数据块的可用空间情况。

索引段使用的表空间既可以是索引所有者的默认表空间,也可以是在 CREATE INDEX 语句中指定的表空间。索引无需和其相关的表位于同一表空间中。相反,如果将索引与其相关表存储在不同磁盘上能够提升使用此索引的查询性能,因为此时 Oracle 能够并行地访问索引及表数据。

2. PCTFREE和PCTUSED参数

2.1 PCTFREE参数

PCTFREE 参数用来设置一个数据块中至少需要保留多少可用空间(百分比值),为数据块中已有数据更新时可能发生的数据量增长做准备。例如,当用户用 CREATE TABLE 语句创建表时指定了以下参数: PCTFREE 20

这个参数设定了此表对应的数据段中的每个数据块至少保留20%的可用空间,以备块中已有数据更新时使用。只要数据块中行数据区与数据块头的容量之和不超过数据块总容量的80%,用户就可以向其中插入新数据,数据行被放入行数据区,相关信息被写入数据块头。

2.2 PCTUSED 参数

PCTUSED 参数用于决定一个数据块是否可被用于插入新数据,她的依据是数据区与数据块头的容量之和占数据块全部容量的最大百分比。当一个数据块中的可用空间比例小于 PCTFREE参数的规定时,Oracle就认为此数据块无法被用于插入新数据,直到数据块中的占用容量比例小于 PCTUSED参数的限定。在占用容量比例大于 PCTUSED参数的限定之前,Oracle只在更新数据块内已有数据时才会使用此数据块的可用空间。例如,当用户用 CREATE TABLE 语句创建表时指定了以下参数: PCTUSED 40

在例子中,当此表的某数据块占用容量比例高于40%时,Oracle不会将此数据块用于插入新数据行。

3. 索引如何存储 3.1 索引块的格式

一个数据块内可用于存储索引数据的空间等于数据块容量减去数据块管理开销,索引条目管理开销,rowid,及记录每个索引值长度的1字节。

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

CREATE INDEX employees_last_name ON employees(last_name);

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

3.2 索引的内部结构

Oracle 使用平衡树存储索引以便提升数据访问速度。当不使用索引时,用户必须对数据进行顺序扫描来查找指定的值。如果有 n 行数据,那么平均需要扫描的行为 n/2。因此当数据量增长时,这种方法的开销将显著增长。

如果将一个已排序的值列划分为多个区间,每个区间的末尾包含指向下个区间的指针,而搜索树中则保存指向每个区间的指针。此时在 n 行数据中查询一个值所需的时间为 log(n)。这就是 Oracle 索引的基本原理。

在一个平衡树索引中,最底层的索引块(叶块)存储了被索引的数据值,以及对应的 rowid。叶块之间以双向链表的形式相互连接。位于叶块之上的索引块被称为分支块,分枝块中包含了指向下层索引块的指针。如果被索引的列存储的是字符数据,那么索引值为这些字符数据在当前数据库字符集中的二进制值。

对于唯一索引,每个索引值对应着唯一的一个 rowid。对于非唯一索引,每个索引值对应着多个已排序的 rowid。因此在非唯一索引中,索引数据是按照索引键及 rowid 共同排序的。键值全部为 NULL 的行不会被索引,只有簇索引例外。在数据表中,如果两个数据行的全部键值都为 NULL,也不会与唯一索引相冲突。

3.3 索引的属性

有两种类型的索引块:

用于搜索的分支块 用于存储索引数据的叶块

(1) 分支块

分支块中存储以下信息:

最小的键值前缀,用于在本块的两个键值之间做出分支选择 指向包含所查找键值的子块的指针

包含 n 个键值的分支块含有 n+1 个指针。键值及指针的数量同时还受索引块容量的限制。 (2) 叶块

所有叶块相对于其根分支块的深度是相同的。叶块用于存储以下信息:

数据行的键值

键值对应数据行的 ROWID

所有的键值-ROWID 对都与其左右的兄弟节点向链接,并按照(key,ROWID)的顺序排序。

3.4 平衡树结构的优势

平衡树数据结构具有以下优势:

平衡树内所有叶块的深度相同,因此获取索引内任何位置的数据所需的时间大致相同。 平衡树索引能够自动保持平。

平衡树内的所有块容量平均在总容量的 3/4 左右。

在大区间范围内进行查询时,无论匹配个别值还是搜索一个区间,平衡树都能提供较好的查

询性能。

数据插入,更新,及删除的效率较高,且易于维护键值的顺序。

大型表,小型表利用平衡树进行搜索的效率都较好,且搜索效率不会因数据增长而降低。

参考文献:

[1]赵伯山 Oracle 9i中文版实用培训教程[M]. 清华大学出版社 2002 [2]冯凤娟 Oracle数据库体系结构和管理[M]. 清华大学出版社,2003

本文来源:https://www.bwwdw.com/article/bmet.html

Top