http://docs.oracle.com/cd/B28359_01/server.111/b28318/schema.htm#CHDJGADJ
本文内容
- 索引块格式化
- 索引内部结构
- 索引属性
- B-tree 结构的优势
- 参考资料
当创建索引时,Oracle 数据库自动分配索引段以便在表空间保存索引数据。你可以控制为索引段的空间分配,并按下面方式使用这个已保留的空间:
- 为索引段设置存储参数,以控制索引段的扩展。
- 为索引段设置 PCTFREE 参数,以控制构成索引段的数据块中的空闲空间。
索引段的表空间或是拥有者的默认表空间,或是 CREATE INDEX 语句指定的一个表空间。你不必把索引放在与其相关表相同的表空间。因此,你可以通过把索引与其表存储在不同磁盘的不同表空间来提高查询性能,因为,Oracle 数据库可以并行检索索引和表数据。
B-tree 是一种常见的数据结构,也称多路搜索树,并不是二叉树。B-tree 结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度。B 通常是 Balance 的简称。该结构一般用于数据库的索引,综合效率较高。B-tree 主要应用在 OLTP 系统(事务方面),而 Bitmap 主要是在 OLAP(分析方面)。
索引块格式化
索引数据的可用空间是 Oracle 数据库的块大小减去块的开销、条目开销、rowid 和每个已索引值的字节长度。
当你创建索引时,Oracle 数据库读取和排序已索引的列,并把 rowid 随每行的索引值一起存储。之后,Oracle 数据库从下往上加载索引。例如,下面语句:
CREATE INDEX employees_last_name ON employees(last_name);
Oracle 数据库在 employees 表 last_name 列上排序。然后,按已排序的顺序加载带有 last_name 和相应 rowid 值的索引。当使用索引时,Oracle 数据库通过已排序的 last_name 值快速查询,之后,使用与其相关的 rowid 值来定位行。
索引内部结构
Oracle 数据库使用 B-trees 存储索引,来加速数据访问。若没有索引,你必须顺序扫描数据来查找值。对 n 行,检索的平均行数为 n/2。随着数据列的增加,这不能很好地扩展。
一个值的有序列表划分成宽块范围(叶子块),查询时间减少为 log(n)。这是 Oracle 数据库索引的基本原则。
图 1 B-tree 索引的内部结构
图 2 B-tree 索引详细内部结构
B-tree 索引的上半部分块(分支块)包含索引数据,并指向低一级的索引块。最低级别的索引块(叶子块)包含每个已索引的数据值和用于定位真实行的相应 rowid。叶子块是双向链接的(双向链表)。包含字符数据的列中索引是基于数据库字符集的字符二进制值。
对于唯一索引,一个 rowid 对每个数据值存在。对于非唯一索引,rowid 按顺序被包含在键中,因此,非唯一索引按索引键和 rowid 排序。不索引包含 null 的键值,除了聚簇索引。两个行可以包含所有 null 值,这不违反唯一索引。
换个简单、更直观的图,如下图所示:
图 3 B-tree 查询值为 21
说明:
- 每个节点的值个数,最小有两个,最大有五个,Minimum Degree=2,Maximum Degree=5;
- 若查找值 21,则会经过 10、20、30,最后到 21。
索引属性
两类数据块:
- 分支块用来检索
- 叶子块存储值
分支块(Branch Blocks)
分支块存储如下内容:
- 最小键的前缀,需要在两个键之间做出分支决定
- 指向包含键的子块
若数据块具有 n 键,那么它们就有 n+1 个指针。键和指针的数量是由数据块大小限制的。
叶子块(Leaf Blocks)
所有叶子块从 root 到 branch 块都在同一深度。叶子块存储内容如下:
- 每个行的完整键值
- 表中每个行的 ROWIDs
所有键和 rowid 都被链接到它们左边和右边的兄弟。它们按键和 rowid 排序。
B-tree 结构的优势
B-tree 结构有如下优势:
- 树的所有叶子块都在相同深度,这样,在索引中从任何地方检索任何记录都大约花费相同的时间。
- B-tree 自动保持平衡。
- All blocks of the B-tree are three-quarters full on the average.
- B-tree 对大范围查询提供优秀的检索性能,包括精确匹配和访问查询。
- 插入、更新和删除操作有效,维护键的顺序,以便快速检索。
- B-tree 性能对小表和大表都很好,不会随着表的增长而降低。
相关推荐
Oracle支持多种索引类型,包括B*Tree索引、反向索引、降序索引、位图索引、函数索引等。每种索引都有其独特的适用场景和优缺点,了解并合理应用这些索引,对优化Oracle数据库性能至关重要。 #### 二、B*Tree索引...
- **分层结构:**B*Tree索引采用层次化的存储结构,包括根节点、中间节点和叶节点。 - **叶节点:**存储具体的键值对(key-value pair),其中键是索引列的值,而值则是指向对应数据行的行标识符(RID)。 - **中间节点...
- B树索引(B-Tree Index):最常见的索引类型,适用于等值查询。 - 唯一索引(Unique Index):确保索引列的值是唯一的。 - 位图索引(Bitmap Index):适用于低基数(即重复值多)的列,适用于联接查询。 - ...
##### B-Tree索引 - **定义**:B-Tree是一种平衡的多路搜索树,通常用于实现数据库索引。 - **特性**: - 每个节点最多拥有m个子树。 - 根节点最少有2个子树。 - 分支节点最少拥有m/2棵子树。 - 所有叶节点在...
- **索引类型**:介绍B-tree、位图等不同类型的索引。 - **索引优化**:探讨如何优化索引来提高查询性能。 #### 十八、序列、同义词 - **序列**:介绍序列的创建及使用方法。 - **同义词**:讲解同义词的概念及其...
- **索引类型**:包括 B-Tree、位图和反转索引等。 - **创建和管理索引**:学习如何使用 CREATE INDEX 和 DROP INDEX 创建和删除索引。 - **索引的优势与局限性**:讨论索引如何提高查询性能,同时也增加数据写入的...
- `B-Tree Index`: 最常见的索引类型,用于加速基于索引列的查找操作。 - `Bitmap Index`: 适用于包含大量重复值的情况。 - `Reverse Key Index`: 用于避免重复键值冲突。 - `Function-Based Index`: 基于表达式...
16. 索引:介绍Oracle中索引的类型(如B-tree、bitmap、function-based索引等),以及如何建立和优化索引。 17. 序列、同义词:解释序列的创建和使用,以及如何通过同义词简化对象的引用。 18. PL SQL:详细介绍...
- **索引类型**:B-Tree、位图和反转索引。 - **创建索引**:使用 CREATE INDEX 语句创建索引。 - **维护索引**:包括重建、优化索引的方法。 #### 十七、序列、同义词 - **序列**:自动递增的数字序列,常用于生成...
- 索引的概念、类型(如B-Tree、Hash等)及其在查询性能优化上的作用。 - 如何创建索引以及管理索引的使用(CREATE INDEX, ALTER TABLE, DROP INDEX)。 8. 数据库的故障处理与维护 - 日志文件的作用及其管理。 ...
- **索引类型**:掌握不同类型的索引,如 B-tree、位图和反转索引。 - **索引优化**:学习如何创建有效的索引来提高查询性能。 #### 十六、序列、同义词 - **序列**:学习如何使用序列生成唯一的连续整数。 - **...
- **比较**:对比分析 B+Tree、哈希表、队列和记录号等四种数据结构的优缺点。 - **20.5 Berkeley DB 使用 C++ 实例** - **实例演示**:通过具体的 C++ 代码示例来展示 Berkeley DB 的使用方法。 - **20.6 ...
索引是数据库中一种重要的数据结构,它可以显著提高查询效率。常见的索引类型包括: 1. **B-Tree Index**:适用于大多数查询场景。 2. **Bitmap Index**:适用于固定长度的值且值的范围有限的情况。 3. **Function-...