索引组织表(index organized table ,IOT)

本文介绍了索引组织表(IOT)的概念及其优势。IOT按照主键排序存储记录,索引和表合二为一,提高了涉及主键查询的性能并节省存储空间。文章还详细讲解了如何创建IOT及带有溢出区域的IOT。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

索引组织表(index organized table ,IOT)
默认情况下所有的表都是堆组织表,对表中的记录不进行排序。堆组织表通过rowid 来访问 (定位)表中的记录。 IOT 使用b-tree index 的结构 存储记录。逻辑上按照主键排序,和正 常的主键索引不同的是,主键索引仅仅是存储定义列的 值。IOT index 存储所有IOT表中所有 的列,并按照主键排序。索引和表合二为一,存储在同一个数据库对象中。表中记录的访问 也不是通过传统的rowid来现实,而是通过主键来访问。
创建IOT
IOT中需要存在主键,并且在创建IOT的语句中使用organization index 子句。
创建一个堆组织表,并且给定主键约束的名称方便后面的查找和标识。
SQL> create table test_iot 
  2  ( id number(3),name varchar2(12),
  3  constraints test_iot_id#_pk primary key (id))
  4  organization index;
Table created.
查看刚才创建的IOT中的索引。
SQL> select index_name,index_type,table_name,table_type
  2  from user_indexes
  3  where table_name = 'TEST_IOT';
INDEX_NAME      INDEX_TYPE      TABLE_NAME      TABLE_TYPE
--------------- --------------- --------------- -----------
TEST_IOT_ID#_PK IOT - TOP       TEST_IOT        TABLE
堆组织表中的索引与主键的约束同名。下面这个查询进一步说明堆组织表中 索引所在的列。
SQL> select index_name,table_name,column_name
  2  from user_ind_columns
  3  where table_name = 'TEST_IOT';
INDEX_NAME      TABLE_NAME      COLUMN_NAME
--------------- --------------- --------------------
TEST_IOT_ID#_PK TEST_IOT        ID
查看因为创建堆组织表产生的数据库对象。
QL> select object_id,object_name,object_type 
  2  from user_objects
  3  order by object_id desc;
 OBJECT_ID OBJECT_NAME               OBJECT_TYPE
---------- ------------------------- -------------------
     69350 TEST_IOT_ID#_PK           INDEX
     69349 TEST_IOT                  TABLE
查看数据库分配给堆组织表的segment。如果我们给主键约束起了名字
那么堆组织表的segment name 和主键约束的名称相同,否则会使用
系统默认的段名  SYS_IOT_TOP_
SQL> select segment_name,segment_type
  2  from user_segments
  3  where segment_name like 'T%';
SEGMENT_NAME              SEGMENT_TYPE
------------------------- ------------------
TEST_IOT_ID#_PK           INDEX
堆组织表是没有 table segment 的。
IOT 的优势
在SQL语句的查询条件中经常需要使用到表中的主键这种情况下使用IOT可以实现更好的性能 更快的访问速度。另外索引和表合二为一,只用一个segment 并且不需要存储rowid,只存储 一遍primary key values 所有可以节省存储开销。
关于overflow area
如果在堆组织表中的一些列是不经常访问的,或者记录很长应该考虑使用overflow area.把这 部分不常用的数据存放在overflow segment 中。可以使用index segment 比较小,从而在 检索index segment 中的数据时性能更好。注:primary key values  总是存储在index segment 中的,no-key values 可以存储在index segment 中也可以存储在overflow segment 中。 index segment 中的row通过rowid 来连接到overflow segment 中的row.所以select 与DML 语句不能直接的访问overflow 中的数据。 overflow segment  的类型是table not index.
创建带overflow area 的IOT
首先来认识两个很重要的overflow 子句:
overflow pctthreshold 子句 : 指定index block 中保留的空间的百分比。 该百分比需要设置的合理,以便能够有足够的空间来存放primary key values. 其他的列,如果存储在index block 中操作了指定的阀值,将不会存储在index block  中,而是存储在overflow segment 中。语法格式是:
pctthreshold threshold  
threshold in(1...50),默认值是50.
overflow including 子句:指定那些列应该存储在index block 中。
语法格式是:
including column_name
这里的column_name 可以是最后一个primary key 列,也可以是no primary key 列。
创建一个带overflow area 的堆组织表,其中id,first_name,last_name 存放在index block 中, 其他的列存放在overflow segment 的block中。
SQL> create table test_iot_info
  2  ( id number (5),
  3    first_name varchar2 (20),
  4    last_name varchar2 (20),
  5    major varchar2 (30),
  6    current_credits number(3),
  7    grade varchar2(2),
  8    constraints test_iot_info_id#_pk primary key (id))
  9    organization index 
 10    overflow including last_name;
Table created.
查看刚才新建的IOT的索引信息
SQL> select index_name,index_type,table_name
  2  from user_indexes
  3  where table_name = 'TEST_IOT_INFO';
INDEX_NAME      INDEX_TYPE      TABLE_NAME
---------------  --------------- ------------------------------
TEST_IOT_INFO_ID#_PK IOT - TOP       TEST_IOT_INFO
SQL> select index_name,table_name,column_name
  2  from user_ind_columns
  3  where table_name = 'TEST_IOT_INFO';
INDEX_NAME      TABLE_NAME                     COLUMN_NAME
--------------- ------------------------------ ---------------
TEST_IOT_INFO_ID#_PK TEST_IOT_INFO                  ID
查看由创建IOT 所生成的对象,这里因为使用了overflow 所以
多出了一个   SYS_IOT_OVER_69353. overflow 的命名格式是
 SYS_IOT_OVER_
SQL> select object_id,object_name,object_type 
  2  from user_objects
  3  order by object_id desc;
 OBJECT_ID OBJECT_NAME                    OBJECT_TYPE
---------- ------------------------------ -------------------
     69355 TEST_IOT_INFO_ID#_PK           INDEX
     69354 SYS_IOT_OVER_69353             TABLE
     69353 TEST_IOT_INFO                  TABLE
查看由创建IOT 表生成的segment。
SQL> select segment_name,segment_type
  2  from user_segments
  3  order by segment_name;
SEGMENT_NAME              SEGMENT_TYPE
------------------------- ------------------
SYS_IOT_OVER_69353   TABLE
TEST_IOT_INFO_ID#_PK INDEX
注意 IOT 表的overflow segment name 与 对象名相同。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26110315/viewspace-720719/,如需转载,请注明出处,否则将追究法律责任。

user_pic_default.png
请登录后发表评论 登录
全部评论
<%=items[i].createtime%>

<%=items[i].content%>

<%if(items[i].items.items.length) { %>
<%for(var j=0;j
<%=items[i].items.items[j].createtime%> 回复

<%=items[i].items.items[j].username%>   回复   <%=items[i].items.items[j].tousername%><%=items[i].items.items[j].content%>

<%}%> <%if(items[i].items.total > 5) { %>
还有<%=items[i].items.total-5%>条评论 ) data-count=1 data-flag=true>点击查看
<%}%>
<%}%> <%}%>

转载于:http://blog.itpub.net/26110315/viewspace-720719/

在 Oracle 数据库中,索引组织表空间(Index-organized Tablespace,IOT)是一种特殊的表空间类型,它主要用于存储索引组织表Index-organized tableIOT)。 索引组织表是一种特殊的表,它将数据存储在一个主索引结构中,而不是存储在一个数据区中。这样可以加快数据的检索速度,特别是在大型表中查找数据时,可以显著提高查询效率。 索引组织表空间与普通表空间的区别在于,它使用了一种称为 B-tree 索引的数据结构来组织数据。在 B-tree 索引中,每个节点都包含了一些关键字和指向其他节点的指针,这样可以快速地查找目标数据。 索引组织表空间可以使用以下 SQL 语句来创建: ```sql CREATE TABLESPACE iot_tablespace DATAFILE 'file_name' SIZE size EXTENT MANAGEMENT LOCAL UNIFORM SIZE uniform_extent_size SEGMENT SPACE MANAGEMENT AUTO; ``` 其中,`iot_tablespace` 是要创建的表空间的名称,`file_name` 是要创建的数据文件的名称,`size` 是数据文件的初始大小,`uniform_extent_size` 是每个数据块的大小。 索引组织表空间还可以使用以下 SQL 语句来管理: - ALTER TABLESPACE:用于修改索引组织表空间的属性,例如修改表空间的大小、添加数据文件等。 - DROP TABLESPACE:用于删除索引组织表空间。 需要注意的是,在使用索引组织表空间存储数据时,还需要使用 IOT 数据类型来定义表,以及使用专门的 IOT 函数来操作 IOT 数据。此外,在使用索引组织表空间时,还需要考虑备份和恢复的问题,必须正确地备份和恢复索引组织表空间中的数据,以确保数据的完整性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值