IOT ( Index Organized Table
) 的用例是什么?
假设我有桌子
- ID
- 姓名
- 姓
我知道物联网,但对用例有点困惑IOT
您的三列不是一个好的用例。
当您经常访问表中的许多连续行时,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;
将索引组织的表视为索引。我们都知道索引的意义:提高对特定数据行的访问速度。这是在列子集上构建复合索引的技巧的性能优化,可用于满足常用查询。如果索引可以完全满足查询投影中的列,则优化器知道它根本不需要从表中读取。
物联网正是对其逻辑混乱采取的这种方法:构建索引并丢弃基础表。
决定是否将表实现为 IOT 有两个标准:
第二点是吸引大多数人的地方,也是物联网用例很少见的主要原因。Oracle 不建议在 IOT 上构建其他索引,这意味着任何不从主键驱动的访问都将是全表扫描。如果表很小并且我们不需要经常通过其他路径访问它,这可能无关紧要,但它是大多数应用程序表的杀手。
候选表也可能具有相对较少的行数,并且可能是相当静态的。但这不是硬性规定;当然,仍然可以考虑将一个符合上面列出的两个标准的巨大的、易变的表作为物联网来实现。
那么是什么造就了一个好的候选dor索引组织呢?参考数据。大多数代码查找表是这样的:
code number not null primary key
description not null varchar2(30)
几乎总是我们只对获取给定代码的描述感兴趣。因此,将其构建为 IOT 将节省空间并减少获取描述的访问时间。