oracle- index组织表

时间:2012-07-05 18:42:00

标签: oracle

物联网(Index Organized Table)的用例是什么?

假设我有像

这样的表格
  1. id
  2. 名称
  3. 姓氏
  4. 我知道IOT,但有点混淆IOT

    的用例

2 个答案:

答案 0 :(得分:4)

你的三个专栏没有成为一个好的用例。

当您经常从表中访问许多连续行时,IOT最有用。然后定义主键,以便表示所需的顺序。

一个很好的例子可能是时间序列数据,例如历史股票价格。为了绘制股票股票价格的图表,可以读取连续日期的许多行。

因此主键是股票代码(或安全ID)和日期。额外的列可能是最后的价格和数量。

常规表 - 即使是自动收报机和日期的索引 - 也会慢得多,因为实际的行将分布在整个磁盘上。这是因为你不能影响行的顺序,因为数据是每天插入的(而不是自动收报机)。

在索引组织表中,同一个自动收报机的数据最终会出现在几个磁盘页面上,并且可以轻松找到所需的磁盘页面。

表格的设置:

CREATE TABLE MARKET_DATA
  (
    TICKER VARCHAR2(20 BYTE) NOT NULL ENABLE,
    P_DATE DATE NOT NULL ENABLE,
    LAST_PRICE NUMBER,
    VOLUME     NUMBER,
    CONSTRAINT MARKET_DATA_PK PRIMARY KEY (TICKER, P_DATE) ENABLE
  )
  ORGANIZATION INDEX;

典型查询:

 SELECT TICKER, P_DATE, LAST_PRICE, VOLUME
 FROM MARKET_DATA
 WHERE TICKER = 'MSFT'
 AND P_DATE BETWEEN SYSDATE - 1825 AND SYSDATE
 ORDER BY P_DATE;

答案 1 :(得分:0)

将索引组织表视为索引。我们都知道索引的要点:提高对特定数据行的访问速度。这是在列子集上构建复合索引的技巧的性能优化,可用于满足常用查询。如果索引可以完全满足查询投影中的列,则优化器知道它根本不必从表中读取。

物联网就是这种方法的逻辑混乱:buidl索引并丢弃基础表。

决定是否将表实现为IOT有两个标准:

  1. 它应该包含一个主键(一个或多个列)和最多一个其他列。 (好吧,也许是其他两个专栏,但它是一个警告标志)。
  2. 表的唯一访问路径是主键(或其主要列)。
  3. 第二点是吸引大多数人的问题,也是IOT用例非常罕见的主要原因。 Oracle不建议在IOT上构建其他索引,这意味着任何不从主键驱动的访问都将是全表扫描。如果表很小并且我们不需要经常通过其他路径访问它可能无关紧要,但它对大多数应用程序表来说都是一个杀手。

    候选表也可能具有相对较少的行数,并且可能是相当静态的。但这不是一个严格的规则;当然,与上面列出的两个标准相匹配的巨大的,易变的表仍然可以考虑用作IOT的实现。

    那么什么才能成为一个好的候选人指数组织?参考数据。大多数代码查找表都是这样的:

    code number not null primary key
    description not null varchar2(30)
    

    我们几乎总是只对获取给定代码的描述感兴趣。因此,将其构建为IOT将节省空间并减少获取描述的访问时间。