我什么时候应该使用Oracle的Index Organized Table?或者,我什么时候不应该?

Mr.*_*Red 34 database oracle indexing

索引组织表(IOT)是存储在索引结构中的表.尽管存储在堆中的表是无组织的,但IOT中的数据被存储并按主键排序(数据是索引).IOT的行为就像"常规"表一样,并且您使用相同的SQL来访问它们.

适当的关系数据库中的每个表都应该有一个主键...如果我的数据库中的每个表都有一个主键,我应该总是使用索引组织表吗?

我猜答案是否定的,所以什么时候索引组织表不是最佳选择?

APC*_*APC 19

基本上,索引组织表是没有表的索引.因此,如果您的表的列由主键和最多一个其他列组成,那么您可能有INDEX ORGANIZED的候选者.

但是如果你发现自己正在考虑在非主键列上需要额外的索引,那么你可能最好使用常规堆表.因此,由于大多数表可能需要额外的索引,因此大多数表不适合IOT.

在实践中,索引组织表最有可能是参考数据,代码查找事务.应用程序表几乎总是只有堆组织.


Gar*_*ers 13

我认为它们适用于非常窄的表(例如用于解析多对多表的连接表).如果(几乎)表中的所有列都将在索引中,那么为什么不使用IOT.

如理查德福特在这里讨论的那样,小桌子可以成为物联网的良好候选者


Jef*_*emp 9

我认为以下几种表格是物联网的优秀候选者:

  • "小""查找"类型表(例如,经常查询,不经常更新,适合相对较少的块)
  • 您已经拥有一个覆盖所有列的索引的任何表(即如果索引复制了100%的数据,也可以保存表使用的空间)


Ian*_*ter 8

从Oracle Concepts指南:

当必须将相关数据存储在一起或者数据必须以特定顺序物理存储时,索引组织表非常有用.此类表通常用于信息检索,空间(请参阅"Oracle Spatial概述")和OLAP应用程序(请参阅"OLAP").

来自AskTom的这个问题可能也有一些兴趣,特别是当有人提供一个场景然后要求IOT比堆组织表更好的时候,Tom的回答是:

我们可以整天假设,但在你测量它之前,你永远不会确定.


Wil*_*l A 0

我本身无法评论 IOT,但是如果我没看错的话,那么它们与 SQL Server 中的“聚集索引”相同。通常,如果您的主键(或者您正在索引的值,如果它不是主键)可能相当随机地分布,那么您应该考虑不使用这样的索引 - 因为这些插入可能会导致许多页面拆分(昂贵的)。

诸如标识列(Oracle 中的序列?)和“当前日期附近”的日期之类的索引往往是此类索引的良好候选者。