5 Indexes and Index-Organized Tables
Overview of Index-Organized Tables
Index-Organized Tables with Row Overflow Area
带行溢出区的索引组织表
创建索引组织表时,可以指定一个单独的段作为行溢出区。
在索引组织表中,B树索引条目可能很大,因为它们包含整个行,因此使用一个单独的段来容纳这些条目是很有用的。相比之下,普通B树条目通常很小,因为它们只包含键和rowid。
如果指定了行溢出区域,那么数据库可以将索引组织表中的行分为以下两个部分:
• 索引条目
这部分包含所有主键列的列值,一个指向行溢出部分的物理rowid,以及可选的一些非键列。这部分存储在索引段中。
• 溢出部分
这部分包含剩余非键列的列值。这部分存储在溢出存储区段中。
另请参阅:
- Oracle Database Administrator’s Guide 了解如何使用CREATE TABLE的OVERFLOW子句设置行溢出区
- Oracle Database SQL Language Reference 了解CREATE TABLE … OVERFLOW的语法和语义
Secondary Indexes on Index-Organized Tables
索引组织表的辅助索引
辅助索引是针对索引组织表的索引。
从某种意义上说,辅助索引是一个索引的索引。它是一个独立的模式对象,与索引组织表分开存储。
Oracle数据库在索引组织表中使用称为逻辑rowid的行标识符。逻辑rowid是表主键的base64编码表示形式。逻辑rowid的长度取决于主键的长度。
由于插入操作,索引叶块中的行可能在块内部或块之间移动。与堆组织行不同,索引组织表中的行不会像堆组织表那样迁移行。因为索引组织表中的行没有永久的物理地址,数据库使用基于主键的逻辑rowid。
例如,假设departments表是索引组织的。location_id列存储每个部门的ID。表存储行如下,最后一个值是位置ID:
10,Administration,200,1700
20,Marketing,201,1800
30,Purchasing,114,1700
40,Human Resources,203,2400
在location_id列上的辅助索引可能具有如下索引条目,逗号后面的值是逻辑rowid:
1700,*BAFAJqoCwR/+
1700,*BAFAJqoCwQv+
1800,*BAFAJqoCwRX+
2400,*BAFAJqoCwSn+
辅助索引提供了对索引组织表的快速有效的访问,使用的列既不是主键也不是主键的前缀。例如,查询ID大于1700的部门名称可以利用辅助索引加快数据访问。
-
逻辑rowid和物理猜测
辅助索引使用逻辑rowid来定位表行。 -
索引组织表上的位图索引
索引组织表上的辅助索引可以是位图索引。位图索引为每个索引键存储一个位图。
另请参阅:
- “Rowid Data Types” 了解更多关于rowid的使用,以及ROWID伪列
- "Chained and Migrated Rows " 了解行为什么会迁移,迁移为什么会增加I/O数量
- Oracle Database Administrator’s Guide 了解如何在索引组织表上创建辅助索引
- Oracle Database VLDB and Partitioning Guide 了解如何在索引组织表分区上创建辅助索引
往期内容:
Oracle官方文档翻译《Database Concepts 23ai》第5章-索引和索引组织表-索引组织表概述(1)