暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

oracle 索引组织表

原创 不吃草的牛_Nick 2023-03-05
613

索引组织表(Index-Organized Table, IOT)是在其中存储整个行的索引,而不仅仅是存储行 的键值。行的主键作为行的逻辑标识符而不是存储行的RowID. IOT中的行没有RowID。

在IOT中,通过它们的主键值按顺序存储行。因此,任何基于主键的范围査询都会受益, 因为行是按顺序存储的(査看本章第8.2节,了解排序普通表中数据的相关步骤)。此外,任何 基于主键的相等査询也会受益,因为表的数据全部存储在索引中。在传统的表/索引组合中,基 于索引的访问需要在索引访问后面跟上表访问.在IOT中,只需要访问IOT,没有任何伴随的索引。

然而,通过使用单个索引访问替代普通的索引/表组合访问获得的性能改进可能非常小, 因为任何基于索引的访问都是非常快速的。为了帮助进一步改进性能,索引组织表提供了额外的特性:
★ 溢出区域: 通过在创建IOT时设置pctthreshold参数,可以分开存储主键数据和行数据。 如果行数据超出块中可用空间的限度,它将动态移动到溢出区域。可以指定溢出区域 位于单独的表空间中,从而改进分布与表相关的I/O的能力。
★ 二级索引: 可以在IOT上创建二级索引。Oracle将使用主键值作为行的逻辑RowID.
★ 减少的存储需求: 在传统的表/索引组合中,相同的键值存储在两个位置中。在IOT中,它们只存储一次,从而减少存储需求。

提示:
当指定溢出区域时,可以使用including column子句来指定将存储在溢出区域中的列(以及表定义中的所有后继列):
create table ord_iot
(order_id number,
order_date date,
order_notes varchar2(1000),
primary key(order_id,order_date))
organization index including order_date
overflow tablespace over_ord_tab
PARTITION BY RANGE (order_date)
(
PARTITION pl VALUES LESS THAN ('01-JAN-2005') TABLESPACE dataOl,
PARTITION p2 VALUES LESS THAN (MAXVALUE) TABLESPACE data02
);

order_date和order_notes都将存储在溢出区域中。

为了创建IOT,可以使用create table命令的organization index子句。在创建IOT时必须指 定主键。在IOT中,可以删除列,或者通过alter table命令的set unused子句将列标记为不活动。


8.4.5 索引组织表的调整问题
类似于索引,在插入、更新和删除值时,IOT可能会逐渐在内部产生存储碎片。为了重新构建IOT,可以使用alter table命令的move子句。在下面的示例中,重新构建了 EMPLOYEE_IOT 表及其溢出区域:
alter table EMPLOYEE_IOT move tablespace DATA overflow tablespace DATA OVERFLOW;

应该避免在IOT中存储长行的数据。一般来说,如果数据长度超过数据库块大小的75%, 则应该避免使用IOT.如果数据库块大小是4KB,并且行的长度超出3KB,则应该考虑使用普 通表和索引,而不是使用IOT。行越长,针对IOT执行的事务越多,就越需要频繁地重新构建IOT

注意:
在IOT中不可以使用LONG数据类型,但可以使用LOB.

索引影响数据加载速率。为了获得最佳的结果,索引组织表的主键索引应该和连续的值一起加载,从而最小化索引管理的成本。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论