在Oracle数据库中,什么是索引组织表(IOT)

0    43    4

Tags:

👉 本文共约1763个字,系统预计阅读时间或需7分钟。

简介

索引组织表简称索引表(Index-Organized Table,IOT),是把索引和一般数据列全部存储在相同位置上的表结构,是一个存储在索引结构中的表。它的特点是存储慢,读取快。索引组织表(IOT)不仅可以存储数据,还可以存储为表建立的索引。索引组织表的数据是根据主键排序后的顺序进行排列的,这样就提高了访问的速度,但是,这是由牺牲插入和更新性能为代价的(每次写入和更新后都要重新进行排序)。索引组织表的数据存储在与其关联的索引中。索引中存储的是行的实际数据,而不是ROWID,它是基于主键访问数据的。在索引组织表中,索引就是数据,数据就是索引。

CREATE TABLE命令与ORGANIZATION INDEX子句一起用于创建索引组织表,如下例所示:

通过如下的SQL可以得到所有的IOT表:

辅助索引(Secondary Indexes)也叫二级索引,是一个建立在索引组织表上的索引。在某种意义上,它是一个索引的索引。辅助索引是一个独立的模式对象,并与索引组织表分开存储。索引表上的辅助索引能够非常有效地访问索引表,这种索引既不是使用主键列也不是使用主键的某个前缀。Oracle构造这种索引使用的是逻辑的行标识符(Logical Rowids),这种ROWIDS是基于表的主键(而不是基于行的物理地址)。这种逻辑ROWIDS包括了一个物理猜想(Physical Guess),它也是一种物理标识符(物理指针),它唯一标识行的块地址,Oracle能使用这些猜想直接对索引表的叶块进行探测,从而避免主键搜索。

通过如下的SQL可以得到所有的辅助索引:

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!

对于IOT,需要注意以下两点内容:

  • 当创建IOT时,必须要设定主键,否则报错。

  • 索引组织表实际上将所有数据都放入了索引中。

索引组织表的应用场景

索引组织表可应用在以下情况:

  • 小表,经常读,但更新不频繁的表。IOT适用于那些需要经常访问和查询的小型表格。因为IOT的数据行按照主键的顺序排列,所以查询速度很快。IOT适用于那些不经常更新的表格。因为IOT的数据行按照主键的顺序排列,如果数据行被更新,可能需要重新排序整个表格,这会导致性能下降。
  • 数据压缩:IOT适用于那些需要进行数据压缩的表格。因为IOT的数据行按照主键的顺序排列,相邻的数据行通常具有相似的值,所以可以使用压缩算法来减少存储空间。
  • 经常通过主键访问的表。IOT适用于那些需要唯一性约束的表格。因为IOT的主索引就是主键,所以可以保证表格中的数据行具有唯一的主键值。
  • 经常用BETWEEN…AND…或按照主键或唯一键进行查询。
  • 数据物理上分类查询。如一张订单表,按日期装载数据,想查单个客户不同时期的订货和统计情况。

索引表和常规表对比

索引表和常规表不同之处如下表所示:

常规表(Heap-OrganizedTable)索引表(Index-Organized Table)
简介ROWID唯一标识一行。主键可指定也可不指定(因为已经有ROWID了)由主键来唯一标识一行,所以,主键必须指定
ROWID使用物理ROWID,允许使用它创建二级索引使用逻辑ROWID,允许使用它创建二级索引
访问数据访问基于物理ROWID(使用物理地址)访问基于逻辑ROWID(使用主键)
扫描方式使用顺序扫描,返回所有行使用全索引扫描,返回所有行,并按主键顺序排列
是否可以被存储在簇中能被存储在一个簇中不能被存储在一个簇中
能否含有LONG和LOB一列中能够含有数据类型为LONG、LOB的数据能含有LOB数据类型,但不能有LONG数据类型
是否支持分区支持分区不支持分区
是否允许包含虚拟列可以包含虚拟列不能包含虚拟列

标签:

头像

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

嘿,我是小麦,需要帮助随时找我哦
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部
返回顶部