Oracle B-tree 索引结构、如何存储及其优势
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 性能对小表和大表都很好,不会随着表的增长而降低。
参考资料
Bitmap 索引 vs. B-tree 索引:如何选择以及何时使用?——1-5
Bitmap 索引 vs. B-tree 索引:如何选择以及何时使用?——2-5
Bitmap 索引 vs. B-tree 索引:如何选择以及何时使用?——3-5
Bitmap 索引 vs. B-tree 索引:如何选择以及何时使用?——4-5