http://fangrn.javaeye.com/blog/514448
初识 oracle 中的索引组织表
索引组织表( IOT )有一种类 B 树的存储组织方法。普通的堆组织表是以一种无序的集合存储。而 IOT 中的数据是按主键有序的存储在 B 树索引结构中。与一般 B 树索引不同的的是,在 IOT 中每个叶结点即有每行的主键列值,又有那些非主键列值。
如下图所示,在 IOT 所对应的 B 树结构中,每个索引项包括 < 主键列值,非主键列值 > 而不是 ROWID ,对于普通堆组织表, oracle 会有对应的索引与之对应,且分开存储。换句话说, IOT 即是索引,又是实际的数据。
普通表索引与表数据的对应关系
IOT 的索引项和表数据的对应关系
IOT
和普通表对于应用程序来说,例如
sql
查询语句,是没有区别的。也就是说
oracle
中对表的组织形式对应用来说是透明的。
下表总结了
IOT
与一般表的区别:
普通表
|
IOT
|
ROWID
唯一确定一行录
|
主键唯一确定一行记录
|
可以不指定主键
|
必须指定主键
|
ROWID
伪列中保存物理
rowid
,可以构建二级索引
|
ROWID
伪列中保存逻辑
rowid
,可以构建二级索引
|
基于
rowid
进行访问
|
基于逻辑
rowid
进行访问
|
顺序扫描才能得到所有行
|
只须扫描索引即可返回所有行
|
可以和其它表一起聚集存储
|
不能存储为聚集表
|
可以包含
long
和
lob
类型的列
|
可以包含
lob
类型但不可以包括
long
类型的列
|
使用
IOT
的好处:
1
、由于索引项和数据存储在一起,所以无论是基于主键的等值查询还是范围查询都能大大节省磁盘访问时间。
2
、为了能够更快地访问那些频繁访问的列,可以使用溢出存储选项将那些访问不频繁的列放在
B
树叶结点数据块之外的溢出堆空间中。这样一来便可以得到更小的
B
树,以及包含更多行的叶结点
3
、和堆组织表和索引不同,主键不需要被存储两次。
4
、
ROWID
伪列是基于主键值的逻辑
rowid
,而不是物理
rowid
,即使表被重新组织过,造成了基表行的迁移,二级索引仍然可用,不需要重建。
注:
1
、
Oracle
使用
rowid
数据类型存储行地址
,rowid
可以分成两种,分别适于不同的对象,
Physical rowids
:存储
ordinary table,clustered table,table partition and subpartition,indexe,index partition and subpartition;
Logical rowids :
存储
IOT
的行地址
2
、每个表在
oracle
内部都有一个
ROWID
伪列
,
它在所有
sql
中无法显示,不占存储空间
;
它用于从表中查询行的地址或者在
where
中进行参照
,
一个例子如下:
SELECT ROWID, last_name FROM employees;
Oracle
内部使用保留在
ROWID
伪列中的值构建索引结构
,rowid
伪列不存储在数据库 中
,
它不是数据库表的数据
,
(从
database
及
table
的逻辑结构来说)。事实上
,
在物理结构上
,
每行由一个或多个
row pieces
组成
,
每个
row piece
的头部包含了这个
piece
的
address,
即
rowid.
从这个意义上来说,
rowid
还是占了磁盘空间的
.
3
、二级索引:
也可理解为聚集索引,好比是我们人查字典时自已会使用的索引。