Oracle 索引组织表与标准表
索引组织表也称为IOT ,索引组织表实际上一个表,不过它的存储结构不像普通的表那样采用堆组织方式,而是采用索引的组织方式。
对于普通表而言,其存储结构是将记录无序地存放在数据段中,而索引化组织表是将记录按照某个主键列进行排序后,再以B 树的组织方式存放在数据段中。
由于整条记录都被保存在索引中,所以索引组织表不需要使用ROWID 来确定记录的位置。
在索引组织表中只需要知道主键列的值,就能够直接找到相应记录的完整内容。
因此,索引组织表提供了快速的、基于主键的对表中数据快速访问。
但是,这是以牺牲插入和更新性能为代价的。
图9-6所示示意性地列出了索引组织表与标准表之间的区别。
ROWID
普通表索引索引表
主键行头非主键列
图9-6 索引组织表与标准堆表的对比
对于普通表而言,表、索引数据是分别存放在表段、索引段,要占用更多空间;而对于索引表而言,主键列和非主键列的数据都被存放在主键索引段中。
当经常要使用主键列定义表数据时,应该建立索引表。
使用索引表,一方面降低了磁盘和内存空间占用。
另一方面也可以提高访问性能。
建立索引表也是使用CREATE TABLE 语句完成的。
需要注意,建立索引组织表时,必须指定ORGANIZATION INDEX 关键字,并且在索引组织表中必须定义主键约束。
例如,下面的语句建立一个索引组织的EMPLOYEES 表: SQL> create table employees(
2 empno number(5) primary key,
3 ename varchar2(15) not null,
4 job varchar2(10),
5 hiredate date default (sysdate),
6 sal number(7,2),
7 deptno number(3) not null
8 ) organization index
9 tablespace users;
表已创建。
如果向索引组织表中添加数据,Oracle会根据主键列进行对其排序,然后再将数据写入磁盘。
这样在使用主键列查询时,在索引组织表上可以得到更好的读取性能。
在标准堆表上进行相同的查询时,需要首先读取索引,然后再判断数据块在磁盘上的位置,最后Oracle 必须将相关的数据块放入内存中。
而索引组织表将所有数据都存储在索引中,所以不需要再去查找存储数据的数据块。
这样相同的查询,在索引组织表中执行的效率是标准堆表的两倍。
虽然索引组织表的查询执行效率比堆表高,但时索引组织表比堆表更难于维护。
当向堆表中添加数据时,Oracle只需要简单地在表的盘区中找到一个可用空间保存数据。
而索引组织表由于需要对数据按照B树结构进行组织,所以Oracle要根据所添加数据的主键将数据写合适的数据块。
这就不可避免的要在数据块中移动已经存在的行,以提供足够的空间存放新行。