标准表的存储方式是使用堆存储方式,因此标准表也常常称为堆组织表(heap organized table)堆存储方式是指数据以堆的方式进行管理。堆存储方式比较随机,在向表中插入数据时,将总是找到第一个能放下此数据的自由空间,在堆记录进行删除或修改时,将会一处部分空间以便重用,所以它是一种随机的表存储方式。
堆组织表的随机存储方式使得访问表中的数据也变得比较随机,如果查询一个包含海量数据的表,将会非常耗时耗力,为此Oracle表一般会创建索引。表上的索引是单独存储的一类数据库对象,它通过将特定的字段内容提取到一个单独存储位置,保留对记录的引用,就好像为图书添加了目录,能大大加速数据检索的性能。
索引的组织与堆表的组织不相同,一堆使用B树的组织结构,它通过 ROWID 来引用到具体的表。Oracle的索引组织表是索引与标准表的混合体,它是使用索引存储数据的结构来存储数据的。
索引表中的数据按照主键的结构进行存储排序,可以说它是使用了索引的结构来存储表中的数据,因而它能提供非常高的查询执行性能。适用于需要根据主键的值来进行查询的情况,可以在不单独重建索引的情况下进行重构
索引表的创建也是使用 CREATE TABLE 语句,它有如下两个必须提供的条件
- 在 CREATE 语句后面使用 ORGANIZATION INDEX 关键字,用来指定建立的是索引组织表
- 必须指定一个主键,可以通过在列后使用 PRIMARY KEY 列属性或者是在表级别添加索引来实现
除了这两个必备的条件之外,还可以使用如下的几个可选项来设置索引组织表
- OVERFLOW 子句,用来存储溢出段的一个数据段,保存非主键列的数据到一个单独的溢出数据段中。
- PCTTHRESHOLD 值,用来说明在索引块中为索引表预留的空间百分比值,超出这个值的任何部分将保存在溢出区
- INCLUDING 子句,指定与键列一起存储的非键列,只要不超出指定的预留极限值,就可以尽量把所有非键列保存在索引叶块中,超出部分将保存在溢出段中。
下面演示了如何使用语句创建一个图书目录列表的索引表,这个表