5 Indexes and Index-Organized Tables
Overview of Index-Organized Tables
索引组织表概述
索引组织表是存储在B树索引结构的一种变体中的表。相比之下,堆组织表会将行插入到适合的位置。
在索引组织表中,行被存储在针对表的主键的索引中。B树中的每个索引条目也存储非键列的值。因此,索引即是数据,数据即是索引。应用程序可以像操作堆组织表一样,使用SQL语句操作索引组织表。
以索引组织表的进行类比,假设一位人力资源经理有一个装纸箱的书架。每个纸箱都标有一个编号——1、2、3、4等等——但这些纸箱不是按顺序放置在架子上的。相反,每个纸箱包含指向序列中下一个纸箱位置的指针。
每个纸箱中存放着包含员工记录的文件夹。文件夹按员工ID排序。员工 King 的ID是100,即最低ID,所以他的文件夹在纸箱1的底部。员工101的文件夹在100的上方,102在101的上方,依此类推,直到纸箱1装满为止。序列中的下一个文件夹在纸箱2的底部。
将文件夹按员工ID排序,可以有效地搜索文件夹,而无需维护一个单独的索引。假设用户请求员工107、120和122的记录。经理可以按顺序搜索文件夹并逐个进行检索,而不是在一个步骤中搜索索引并在另一个步骤中检索文件夹。
索引组织表通过主键或有效的前缀,提供对表行更快的访问。行的非键列存在于叶块中,避免了额外的数据块I/O。例如,员工100的薪水存储在索引行本身中。此外,由于行是按主键顺序存储的,通过主键或前缀进行范围访问,只涉及最小的块I/O。另一个好处是避免了一个单独的主键索引的空间开销。
索引组织表在相关数据片段必须存储在一起,或数据必须以特定的顺序物理地存储时非常有用。这种表的典型用途包括信息检索、空间数据和OLAP应用。
-
索引组织表特征
数据库系统通过操作B树索引结构来执行索引组织表的所有操作。 -
带行溢出区的索引组织表
创建索引组织表时,可以指定一个单独的段作为行溢出区。 -
索引组织表的辅助索引
辅助索引是索引组织表上的索引。
另请参阅:
- Oracle Spatial and Graph Developer’s Guide 了解Oracle空间和图形的概述
- Oracle Database Administrator’s Guide 学习如何管理索引组织表
- Oracle Database SQL Language Reference 了解CREATE TABLE … ORGANIZATION INDEX的语法和语义
Index-Organized Table Characteristics
索引组织表特点
数据库系统通过操作B树索引结构来执行所有对索引组织表的操作。
下表总结了堆组织表与索引组织表之间的区别。
表5-6 堆组织表与索引组织表的比较
堆组织表 | 索引组织表 |
---|---|
rowid唯一标识一行。主键约束可以选择性地定义。 | 主键唯一标识一行。必须定义主键约束。 |
允许在ROWID伪列中的物理rowid上构建辅助索引。 | 允许在ROWID伪列中的逻辑rowid上构建辅助索引。 |
可以通过 rowid直接访问单个行。 | 可以通过主键间接实现访问单个行。 |
顺序全表扫描按照一定的顺序返回所有行。 | 完全索引扫描或快速完全索引扫描按照一定的顺序返回所有行。 |
可以与其他表一起存储在表簇中。 | 不能存储在表簇中。 |
可以包含一个LONG数据类型的列和多个LOB数据类型的列。 | 可以包含LOB列,但不能包含LONG列。 |
可以包含虚拟列(仅支持关系型堆表)。 | 不能包含虚拟列。 |