初识索引组织表(IOT)
初识oracle中的索引组织表
索引组织表(IOT)有一种类B树的存储组织方法。普通的堆组织表是以一种无序的集合存储。而IOT中的数据是按主键有序的存储在B树索引结构中。与一般B树索引不同的的是,在IOT中每个叶结点即有每行的主键列值,又有那些非主键列值。
如下图所示,在IOT所对应的B树结构中,每个索引项包括<主键列值,非主键列值>而不是ROWID,对于普通堆组织表,oracle会有对应的索引与之对应,且分开存储。换句话说,IOT即是索引,又是实际的数据。
![]()
普通表索引与表数据的对应关系
![]()
IOT的索引项和表数据的对应关系
IOT
和普通表对于应用程序来说,例如
sql
查询语句,是没有区别的。也就是说
oracle
中对表的组织形式对应用来说是透明的。
下表总结了
IOT
与一般表的区别:
使用
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
、二级索引:
也可理解为聚集索引,好比是我们人查字典时自已会使用的索引。
|