`

Oracle 索引组织表(IOT)

 
阅读更多

索引组织表(IOT)有一种类B树的存储组织方法。普通的堆组织表是以一种无序的集合存储。而IOT中的数据是按主键有序的存储在B树索引结构中。与一般B树索引不同的的是,在IOT中每个叶结点即有每行的主键列值,又有那些非主键列值。

在IOT所对应的B树结构中,每个索引项包括<主键列值,非主键列值>而不是ROWID,对于普通堆组织表,oracle会有对应的索引与之对应,且分开存储。换句话说,IOT即是索引,又是实际的数据。

 

索引组织表(IOT)不仅可以存储数据,还可以存储为表建立的索引。索引组织表的数据是根据主键排序后的顺序进行排列的,这样就提高了访问的速度。但是这是由牺牲插入和更新性能为代价的(每次写入和更新后都要重新进行重新排序)。

索引组织表的创建格式如下:

createtableindexTable(

IDvarchar2(10),

NAMEvarchar2(20),

constraintpk_idprimarykey(ID)

)

organizationindex;式

 

注意两点:

● 创建IOT时,必须要设定主键,否则报错。

● 索引组织表实际上将所有数据都放入了索引中。

原文地址:http://blog.csdn.net/dnnyyq/article/details/5195472

 

索引组织表属性

 

1、OVERFLOW子句(行溢出)

 

因为所有数据都放入索引,所以当表的数据量很大时,会降低索引组织表的查询性能。此时设置溢出段将主键和溢出数据分开来存储以提高效率。溢出段的设置有两种格式:

 

PCTTHRESHOLD n:制定一个数据块的百分比,当行数据占用大小超出时,该行的其他列数据放入溢出段

INCLUDING column_name:指定列之前的列都放入索引块,之后的列都放到溢出段

 

● 当行中某字段的数据量无法确定时使用PCTTHRESHOLD。

● 若所有行均超出PCTTHRESHOLD规定大小,则考虑使用INCLUDING。

 

createtablet88(

IDvarchar2(10),

NAMEvarchar2(20),

constraintpk_idprimarykey(ID)

)

organizationindex

PCTTHRESHOLD20

overflowtablespaceusers

INCLUDINGname;

overflow指定溢出数据存放的表空间

 

● 如上例所示,name及之后的列必然被放入溢出列,而其他列根据PCTTHRESHOLD规则。

 

 

2、COMPRESS子句(键压缩)

 

与普通的索引一样,索引组织表也可以使用COMPRESS子句进行键压缩以消除重复值。

具体的操作是,在organization index之后加上COMPRESSn子句

 

● n的意义在于:指定压缩的列数。默认为无穷大。

 

例如对于数据(1,2,3)、(1,2,4)、(1,2,5)、(1,3,4)、(1,3,5)时

若使用COMPRESS则会将重复出现的(1,2)、(1,3)进行压缩

若使用COMPRESS 1时,只对数据(1)进行压缩

 

 

索引组织表的维护

 

索引组织表可以和普通堆表一样进行INSERT、UPDATE、DELETE、SELECT操作。

可使用ALTER TABLE ... OVERFLOW语句来更改溢出段的属性。

 

altertablet88add overflow;--新增一个overflow

 

● 要ALTER任何OVERVIEW的属性,都必须先定义overflow,若建表时没有可以新增

 

alter tablet88pctthreshold 15 including name;--调整overflow的参数

alter tablet88initrans 2 overflow initrans 4;--修改数据块和溢出段的initrans特性

 

● 关于initrans的概念参考http://space.itpub.net/265709/viewspace-166534

 

 

索引组织表的应用


Heap Table 就是一般的表,获取表中的数据是按命中率来得到的。没有明确的先后之分,在进行全表扫描的时候,并不是先插入的数据就先获取。数据的存放也是随机的,当然根据可用空闲的空间来决定。

 

IOT就是类似一个全是索引的表,表中的所有字段都放在索引上,所以就等于是约定了数据存放的时候是按照严格规定的,在数据插入以前其实就已经确定了其位置,所以不管插入的先后顺序,它在那个物理上的那个位置与插入的先后顺序无关。这样在进行查询的时候就可以少访问很多blocks,但是插入的时候,速度就比普通的表要慢一些。
适用于信息检索、空间和OLAP程序。

 

索引组织表的适用情况:
1、 代码查找表。
2、 经常通过主码访问的表。
3、 构建自己的索引结构。
4、 加强数据的共同定位,要数据按特定顺序物理存储。
5、 经常用between…and…对主码或唯一码进行查询。数据物理上分类查询。如一张订单表,按日期装载数据,想查单个客户不同时期的订货和统计情况。

 

经常更新的表当然不适合IOT,因为oracle需要不断维护索引,而且由于字段多索引成本就大。

 

如果不是经常使用主键访问表,就不要使用IOT

 

IOT和普通表对于应用程序来说,例如sql查询语句,是没有区别的。也就是说oracle中对表的组织形式对应用来说是透明的。
使用IOT的好处:
1、由于索引项和数据存储在一起,所以无论是基于主键的等值查询还是范围查询都能大大节省磁盘访问时间。
2、为了能够更快地访问那些频繁访问的列,可以使用溢出存储选项将那些访问不频繁的列放在B树叶结点数据块之外的溢出堆空间中。这样一来便可以得到更小的B树,以及包含更多行的叶结点
3、和堆组织表和索引不同,主键不需要被存储两次。
4、ROWID伪列是基于主键值的逻辑rowid,而不是物理rowid,即使表被重新组织过,造成了基表行的迁移,二级索引仍然可用,不需要重建。

注:
1、Oracle使用rowid数据类型存储行地址,rowid可以分成两种,分别适于不同的对象,Physical rowids:存储ordinary table,clustered table,table partition and subpartition,indexe,index partition and subpartition;Logical rowids :存储IOT的行地址
2、每个表在oracle内部都有一个ROWID伪列,它在所有sql中无法显示,不占存储空间;它用于从表中查询行的地址或者在where中进行参照,一个例子如下:
SELECT ROWID, last_name FROM employees;Oracle内部使用保留在ROWID伪列中的值构建索引结构,rowid伪列不存储在数据库中,它不是数据库表的数据,(从database及table的逻辑结构来说)。事实上,在物理结构上,每行由一个或多个row pieces组成,每个row piece的头部包含了这个piece的address,即rowid.从这个意义上来说,rowid还是占了磁盘空间的.
3、二级索引:也可理解为聚集索引,好比是我们人查字典时自已会使用的索引。

分享到:
评论

相关推荐

    ORACLE索引详解及SQL优化

    此外,了解并运用Oracle的索引优化特性也很重要,如索引组织表(Index-Organized Table, IOT)、覆盖索引(Covering Index)以及物化视图(Materialized View)等。 总的来说,Oracle索引详解及SQL优化是一个深度...

    oracle索引,常见索引问题

    - **索引组织表(Index-Organized Table, IOT)**:数据直接存储在索引结构中,适合主键访问密集的情况。 - **B*树聚簇索引**:一个键值对应一个数据块,包含该键值相关的一组行。 - **降序索引**:数据按照降序...

    09 oracle的索引 PPT

    - Index-Organized Table (IOT):索引组织表,数据直接存储在索引结构中。 二、索引的优点与缺点 1. 优点: - 提高查询速度:通过索引,数据库可以更快地找到所需的数据。 - 改善排序性能:对ORDER BY和GROUP BY...

    oracle索引机制分析

    ### Oracle索引机制分析 #### 1. 基本索引概念 索引是数据库管理系统(DBMS)为了加快数据检索速度而采用的一种数据结构。Oracle提供了多种类型的索引,每种索引都有其特定的优势和适用场景。索引的基本目的是通过...

    oracle 索引组织表的深入详解

    Oracle 索引组织表(Index-Organized Table, IOT)是一种特殊的表类型,它将数据和索引紧密地结合在一起,以提供快速的数据访问。这种设计使得IOT特别适用于那些通过主键频繁进行查询的场景,因为它利用了主键的排序...

    oracle 索引类型

    IOT是一种特殊的表类型,其数据和索引存储在同一结构中。适合插入密集型操作和全索引扫描的场景。 优点: 1. IOT对于全索引扫描非常快。 2. 减少了对主键的查找,提高了插入速度。 缺点: 1. 删除和更新操作可能...

    ch06 oracle索引

    标题中的"ch06 oracle索引"表明我们将探讨Oracle数据库中的索引机制,这在数据库管理、查询优化以及性能提升方面具有重要意义。Oracle索引是一种数据结构,它能加速对表中数据的查找,提高查询速度,降低I/O操作,...

    oracle索引

    4. Index-organized table (IOT):索引组织表,数据存储在索引结构中,提供更快的插入和查询速度,适用于大量插入和查询的场景。 5. Invisible索引:不参与SQL优化器的查询路径选择,用于测试索引效果,不影响生产...

    提高查询效率的oracle索引优化策略探析.pdf

    另外,索引组织表(Index-Organized Table, IOT)是提高查询效率的有效手段。IOT将数据存储在索引结构中,直接通过索引进行数据访问,减少了访问表数据的步骤,从而加快查询速度。 综上所述,优化Oracle索引的关键...

    oracle 索引

    5. Index-organized table (IOT):索引组织表,数据存储在索引结构中,适合插入密集型操作。 三、索引的优点与缺点 优点: 1. 提高查询性能:通过减少全表扫描,加速数据检索。 2. 改善排序和分组操作:利用索引...

    SQL语句索引优化_sql索引降龙十八掌(Oracle)

    4. Index Organized Table (IOT):索引组织表,将数据存储在索引结构中,提高插入和查询速度。 六、索引反模式 1. 低选择性索引:如果索引列的区分度很低,可能导致全表扫描。 2. 更新频繁的索引:频繁更新索引列会...

    oracle查看表空间表信息

    5. **IOT_NAME**: 如果表是索引组织表(IOT),则存储IOT的名称。 6. **STATUS**: 表的状态。 7. **PCT_FREE**: 为新行预留的空间百分比。 8. **PCT_USED**: 当数据达到这个百分比时,Oracle将自动分配新的空间。 9. *...

    书籍:Oracle与MySQL数据库索引设计与优化

    5. 索引组织表(IOT):将数据直接存储在索引结构中,加快某些类型的数据访问速度。 二、MySQL数据库索引设计 1. InnoDB存储引擎:MySQL的InnoDB引擎支持事务处理并使用B树索引,与Oracle类似,用于等值查询。 2....

    SQL Server和Oracle中索引介绍

    Oracle也支持唯一索引和非唯一索引,以及索引组织表(Index-Organized Table, IOT),这是一种特殊的聚集索引形式。在设计索引时,需要考虑数据库的特定需求,如更新频率、查询模式和数据量,以实现最佳的性能平衡。...

    第四章ORACLE表管理.ppt

    4.5 索引组织表(Index Organized Table IOT) 索引组织表是指将索引和表数据存储在一起的表类型,用于提高查询效率。 4.6 对象表(Object Table) 对象表是指将对象存储在表中的表类型,用于存储复杂的对象数据...

    oracle专家高级编程_建立索引

    #### 11.1 Oracle索引概述 索引在Oracle数据库的应用设计和开发中扮演着至关重要的角色。它能够显著提高查询效率,但同时也可能对数据修改语言(DML)操作如插入、更新和删除等产生负面影响。因此,寻找合适的索引...

Global site tag (gtag.js) - Google Analytics