Index-Organized Table(索引组织表,IOT)有点像混血儿,因为它拥有索引和表两者的特征。IOT是以B-树索引结构(以主键排序方式)存储数据的表,但是它与常规表或堆组织表不同,因为常规表不排序数据。它又与常规的索引不同,因为索引只由索引列组成,而IOT包括了键和非键列。Oracle使用B-树索引结构存储经主键排序过的数据。
在更新IOT时,实际更新的是索引结构。由于访问索引/表只需一个I/O,因此数据访问相当快。不必像传统的建立索引的表那样分别访问索引和实际的表。实际的行数据(不仅仅是ROWID)连同被索引的列值都被一起保存在索引叶块中。IOT特别适合于需要根据主键的值来发布査询的情况。IOT便于非常大的数据库(VLDB)和OLTP应用的使用。IOT可以在不用单独重建索引的情况下重构,这意味着重构的时间小于常规的基于堆的表。
普通Oracle表和索引组织表之间的区别
| 常规Oracle表 | 索引组织表 |
|---|---|
| 物理ROWID | 逻辑ROWID |
| 由ROWID唯一标识 | 由主键唯一标识 |
| 可以包含LONG和LOB数据 | 不能包含LONG数据 |
| 在表群中允许 | 表群中不允许 |
| 较大的空间需求 | 较小的空间需求 |
| 较慢的数据访问 | 更快的数据访问 |
创建一个索引组织表
CREATE TABLE employee_new
(
employee_id NUMBER,
dept_id NUMBER,
name VARCHAR2(30),
address VARCHAR2(120),
CONSTRAINT pk_employee_new PRIMARY KEY(employee_id)
)
ORGANIZATION INDEX TABLESPACE empindex_01
PCTTHRESHOLD 25
OVERFLOW TABLESPACE overflow_tables;
上述CREATE TABLE语句中的一些关键字值得仔细研究。关键短语ORGANIZATION INDEX指出此表是一个IOT而非常规的堆组织表。PCTTHRESHOLD关键字说明在索引块中为employee_new IOT预留的空间百分比。表行中超出每个数据块中的25%极限的任何部分都将保存在溢出区。CREATE TABLE语句将分配overflow_teble表空间以保存索引块中的溢出数据。你可以设置极限值以适应键列和经常访问的几个非键列。可通过执行ANALYZE TABLE ...LIST CHAINED ROWS语句找出哪些行超出此极限值。
可应用可选的INCLUDING子句指出你想与键列一起存储的非键列.只要数据库不超出你指定的极限值,它就会尽量把所有非键列(直到和包含用INCLUDING子句指定的列)保存在索引叶块中。数据库在溢出段中保存其余非键列。如果你给PCTTHRESHOLD和INCLUDING子句指定的值有矛盾,则PCTTHRESHOLD子句将覆盖INCLUDING子句。
在创建索引组织表时使用INCLUDING子句
CREATE TABLE employee_new
(
employee_id NUMBER,
dept_id NUMBER,
name VARCHAR2(30),
address VARCHAR2(120),
CONSTRAINT pk_employee_new PRIMARY KEY(employee_id)
)
ORGANIZATION INDEX TABLESPACE empindex_01
PCTTHRESHOLD 25
INCLUDING name
OVERFLOW TABLESPACE overflow_tables;
INCLUDING子句指示数据库在索引叶块中与键列值一起包含employee_id,dept_id和name列(都是非键列)。
请记住,IOT中的索引项可能较大,因为它们不只是包含一个键值,而且包括所有行值。因此,IOT不需要将所有数据都存储在索引块中。很有可能关键字和行的一部分保存在索引块中,而其余部分则保存在其他表空间中。如果PCTTHRESHOLD参数值太低,可能出现在不同数据块中的行部分的链接问题,导致査询速度下降。




