索引组织表(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_<object_id>
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_<table object_id>.
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 与 对象名相同。
微信关注我们
原文链接:https://yq.aliyun.com/articles/284353
转载内容版权归作者及来源网站所有!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
相关文章
发表评论
资源下载
更多资源优质分享App
近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。
Mario
马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。
腾讯云软件源
为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。
Rocky Linux
Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。