您的位置:首页 > 数据库 > Oracle

【转】初识 oracle 中的索引组织表

2010-01-15 17:47 204 查看
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 、二级索引: 也可理解为聚集索引,好比是我们人查字典时自已会使用的索引。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: