天天看点

初识oracle中的索引组织表

 索引组织表(IOT)有一种类B树的存储组织方法。普通的堆组织表是以一种无序的集合存储。而IOT中的数据是按主键有序的存储在B树索引结构中。与一般B树索引不同的的是,在IOT中每个叶结点即有每行的主键列值,又有那些非主键列值。

如下图所示,在IOT所对应的B树结构中,每个索引项包括<主键列值,非主键列值>而不是ROWID,对于普通堆组织表,oracle会有对应的索引与之对应,且分开存储。换句话说,IOT即是索引,又是实际的数据。

初识oracle中的索引组织表

                               普通表索引与表数据的对应关系         

初识oracle中的索引组织表

                            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 、二级索引: 也可理解为聚集索引,好比是我们人查字典时自已会使用的索引。