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

oracle 索引组织表简单说明一

原创 不吃草的牛_Nick 2023-05-31
501

Index-Organized Table(索引组织表,IOT)有点像混血儿,因为它拥有索引和表两者的特征。IOT是以B-树索引结构(以主键排序方式)存储数据的表,但是它与常规表或堆组织表不同,因为常规表不排序数据。它又与常规的索引不同,因为索引只由索引列组成,而IOT包括了键和非键列。Oracle使用B-树索引结构存储经主键排序过的数据。

在更新IOT时,实际更新的是索引结构。由于访问索引/表只需一个I/O,因此数据访问相当快。不必像传统的建立索引的表那样分别访问索引和实际的表。实际的行数据(不仅仅是ROWID)连同被索引的列值都被一起保存在索引叶块中。IOT特别适合于需要根据主键的值来发布査询的情况。IOT便于非常大的数据库(VLDB)和OLTP应用的使用。IOT可以在不用单独重建索引的情况下重构,这意味着重构的时间小于常规的基于堆的表。

普通Oracle表和索引组织表之间的区别

常规Oracle表索引组织表
物理ROWID逻辑ROWID
由ROWID唯一标识由主键唯一标识
可以包含LONG和LOB数据不能包含LONG数据
在表群中允许表群中不允许
较大的空间需求较小的空间需求
较慢的数据访问更快的数据访问

创建一个索引组织表
CREATE TABLE employee_new
(
employee_id NUMBER,
dept_id NUMBER,
name VARCHAR2(30),
address VARCHAR2(120),
CONSTRAINT pk_employee_new PRIMARY KEY(employee_id)
)
ORGANIZATION INDEX TABLESPACE empindex_01
PCTTHRESHOLD 25
OVERFLOW TABLESPACE overflow_tables;

上述CREATE TABLE语句中的一些关键字值得仔细研究。关键短语ORGANIZATION INDEX指出此表是一个IOT而非常规的堆组织表。PCTTHRESHOLD关键字说明在索引块中为employee_new IOT预留的空间百分比。表行中超出每个数据块中的25%极限的任何部分都将保存在溢出区。CREATE TABLE语句将分配overflow_teble表空间以保存索引块中的溢出数据。你可以设置极限值以适应键列和经常访问的几个非键列。可通过执行ANALYZE TABLE ...LIST CHAINED ROWS语句找出哪些行超出此极限值。

可应用可选的INCLUDING子句指出你想与键列一起存储的非键列.只要数据库不超出你指定的极限值,它就会尽量把所有非键列(直到和包含用INCLUDING子句指定的列)保存在索引叶块中。数据库在溢出段中保存其余非键列。如果你给PCTTHRESHOLD和INCLUDING子句指定的值有矛盾,则PCTTHRESHOLD子句将覆盖INCLUDING子句。

在创建索引组织表时使用INCLUDING子句
CREATE TABLE employee_new
(
employee_id NUMBER,
dept_id NUMBER,
name VARCHAR2(30),
address VARCHAR2(120),
CONSTRAINT pk_employee_new PRIMARY KEY(employee_id)
)
ORGANIZATION INDEX TABLESPACE empindex_01
PCTTHRESHOLD 25
INCLUDING name
OVERFLOW TABLESPACE overflow_tables;

INCLUDING子句指示数据库在索引叶块中与键列值一起包含employee_id,dept_id和name列(都是非键列)。

请记住,IOT中的索引项可能较大,因为它们不只是包含一个键值,而且包括所有行值。因此,IOT不需要将所有数据都存储在索引块中。很有可能关键字和行的一部分保存在索引块中,而其余部分则保存在其他表空间中。如果PCTTHRESHOLD参数值太低,可能出现在不同数据块中的行部分的链接问题,导致査询速度下降。

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

评论