在Oracle数据库中,什么是索引组织表?
A 答案
索引组织表简称索引表(Index-Organized Table,IOT),是把索引和一般数据列全部存储在相同位置上的表结构,是一个存储在索引结构中的表。它的特点是存储慢,读取快。索引组织表(IOT)不仅可以存储数据,还可以存储为表建立的索引。索引组织表的数据是根据主键排序后的顺序进行排列的,这样就提高了访问的速度,但是,这是由牺牲插入和更新性能为代价的(每次写入和更新后都要重新进行排序)。索引组织表的数据存储在与其关联的索引中。索引中存储的是行的实际数据,而不是ROWID,它是基于主键访问数据的。在索引组织表中,索引就是数据,数据就是索引。
CREATE TABLE命令与ORGANIZATION INDEX子句一起用于创建索引组织表,如下例所示:
CREATE TABLE IND_ORG_TAB_LHR(
VENCODE NUMBER(4) PRIMARY KEY,
VENNAME VARCHAR2(20)
)
ORGANIZATION INDEX;
通过如下的SQL可以得到所有的IOT表:
SELECT * FROM DBA_TABLES D WHERE D.IOT_TYPE='IOT';
辅助索引(Secondary Indexes)也叫二级索引,是一个建立在索引组织表上的索引。在某种意义上,它是一个索引的索引。辅助索引是一个独立的模式对象,并与索引组织表分开存储。索引表上的辅助索引能够非常有效地访问索引表,这种索引既不是使用主键列也不是使用主键的某个前缀。Oracle构造这种索引使用的是逻辑的行标识符(Logical Rowids),这种ROWIDS是基于表的主键(而不是基于行的物理地址)。这种逻辑ROWIDS包括了一个物理猜想(Physical Guess),它也是一种物理标识符(物理指针),它唯一标识行的块地址,Oracle能使用这些猜想直接对索引表的叶块进行探测,从而避免主键搜索。
通过如下的SQL可以得到所有的辅助索引:
SELECT * FROM DBA_INDEXES D WHERE D.INDEX_TYPE='IOT - TOP';
对于IOT,需要注意以下两点内容:
l 当创建IOT时,必须要设定主键,否则报错。
l 索引组织表实际上将所有数据都放入了索引中。
索引组织表可应用在以下情况:
v 联机事务处理(OLTP)。
v Internet(例如:搜索引擎和门户网络)。
v 电子商务(例如:电子商店和购物目录)。
v 数据仓库。
v 分析应用。
v 经常通过主键访问的表。
v 加强数据的共同定位,要数据按特定顺序物理存储。
v 经常用BETWEEN…AND…或按照主键或唯一键进行查询。
v 数据物理上分类查询。如一张订单表,按日期装载数据,想查单个客户不同时期的订货和统计情况。
索引表和常规表不同之处如下表所示:
常规表(Heap-Organized Table) |
索引表(Index-Organized Table) |
|
简介 |
ROWID唯一标识一行。主键可指定也可不指定(因为已经有ROWID了) |
由主键来唯一标识一行,所以,主键必须指定 |
ROWID |
使用物理ROWID,允许使用它创建二级索引 |
使用逻辑ROWID,允许使用它创建二级索引 |
访问数据 |
访问基于物理ROWID(使用物理地址) |
访问基于逻辑ROWID(使用主键) |
扫描方式 |
使用顺序扫描,返回所有行 |
使用全索引扫描,返回所有行,并按主键顺序排列 |
是否可以被存储在簇中 |
能被存储在一个簇中 |
不能被存储在一个簇中 |
能否含有LONG和LOB |
一列中能够含有数据类型为LONG、LOB的数据 |
能含有LOB数据类型,但不能有LONG数据类型 |
是否支持分区 |
支持分区 |
不支持分区 |
是否允许包含虚拟列 |
可以包含虚拟列 |
不能包含虚拟列 |