iot

iot表示b-tree的一个变体,用来存储数据。普通的堆表数据已无需的方式来存放,iot表存放在b-tree索引中。每一个叶子存储了key和非key列。这种结构提供了下面的好处:

1在主键上的快速的随机访问,索引的扫描时很迅速的,因为没有分开的存储,表数据的改变(增加新行,更新行,删除行)只是在索引结构中发生。

2主键的快速范围访问,因为数据是以主键的方式顺序放置的。

3低存储要求。

iot表有所有的表的功能,有约束,触发器,lob,和对象列,分区,并行操作,在线重组织,和复制。也提供了

1键压缩

2overflow存储区和具体的列放置

3二级索引,包含位图索引

创建iot表

使用create table表来创建iot表,需要提供下面的信息:

1organization index

2主键,单列的主键或表约束,还可以包含overflow语句,

pctthreshold语句

3including语句,来指定存储在overflow data segment中的非键列,下面是一个创建iot表的例子

CREATE TABLE admin_docindex(
        token char(20), 
        doc_id NUMBER,
        token_frequency NUMBER,
        token_offsets VARCHAR2(512),
        CONSTRAINT pk_admin_docindex PRIMARY KEY (token, doc_id))
    ORGANIZATION INDEX 
    TABLESPACE admin_tbs
    PCTTHRESHOLD 20
    OVERFLOW TABLESPACE admin_tbs2;

使用 overflow语句

这个指定了任何非键列超过块的20%被存放在哪个表空间中,键列必须符合threshold指定的值。如果一个对非键值得update语句导致了行的尺寸减少,数据库指明row pieece(头或是尾)哪块更适合更新,然后重写row piece.如果更新非键列导致了行的尺寸增加,数据库也是看哪合适更新,重写。如果目标更新的是头,这个piece能分裂成2块。在索引叶块中的非键列作为行的head-piece,head-piece包含了一个rowid域连接着下一个存储在溢出数据段中的行piece.

选择和监控threshold值

应该选择threshold来满足key列,最好包含经常访问的非键列,可以使用analyze table ..list chained rows来决定超过限制的行。

使用including语句

除了使用pcthreshold,你还可以使用including语句来控制同键列一起存储的非键列,数据库满足所有的在including中指定的非键列存放在叶块中,不超出指定的threshold,所有的没有在including中指定的非键列存储在溢出数据区中。

CREATE TABLE admin_docindex2(
        token CHAR(20), 
        doc_id NUMBER,
        token_frequency NUMBER,
        token_offsets VARCHAR2(512),
        CONSTRAINT pk_admin_docindex2 PRIMARY KEY (token, doc_id))
    ORGANIZATION INDEX 
    TABLESPACE admin_tbs
    PCTTHRESHOLD 20
    INCLUDING token_frequency
    OVERFLOW TABLESPACE admin_tbs2;

这个语句中token_offsets总是存储在溢出区中。

并行创建iot表

CREATE TABLE admin_iot3(i PRIMARY KEY, j, k, l) 
     ORGANIZATION INDEX 
     PARALLEL
     AS SELECT * FROM hr.jobs;

使用键压缩

键压缩会把索引键分成前缀和后缀,压缩通过后缀条目共享前缀实现的。可以节省很多的空间,来存储更多的key,提高性能。通过使用compress来启用键压缩。可以指定前缀的长度,

You can also specify the prefix length (as the number of key columns), which identifies how the key columns are broken into a prefix and suffix entry.

CREATE TABLE admin_iot5(i INT, j INT, k INT, l INT, PRIMARY KEY (i, j, k)) 
    ORGANIZATION INDEX COMPRESS;

The preceding statement is equivalent to the following statement:

CREATE TABLE admin_iot6(i INT, j INT, k INT, l INT, PRIMARY KEY(i, j, k)) 
    ORGANIZATION INDEX COMPRESS 2;

For the list of values (1,2,3), (1,2,4), (1,2,7), (1,3,5), (1,3,4), (1,4,4) the repeated occurrences of (1,2), (1,3) are compressed away.

You can also override the default prefix length used for compression as follows:

CREATE TABLE admin_iot7(i INT, j INT, k INT, l INT, PRIMARY KEY (i, j, k)) 
    ORGANIZATION INDEX COMPRESS 1;

For the list of values (1,2,3), (1,2,4), (1,2,7), (1,3,5), (1,3,4), (1,4,4), the repeated occurrences of 1 are compressed away.

You can disable compression as follows:

ALTER TABLE admin_iot5 MOVE NOCOMPRESS;


维护索引组织表

可以使用alter table来修改主键索引和溢出数据段物理和存储属性,

ALTER TABLE admin_docindex INITRANS 4 OVERFLOW INITRANS 6;

可以修改pctthreshold和including参数值

ALTER TABLE admin_docindex PCTTHRESHOLD 15 INCLUDING doc_id;

使用add overfow来增加溢出数据段。

alter tableadmin_iot3 add overflow tablespace admin_tbs2;

移动(重建)索引组织表

使用下面的命令来重建索引组织表

alter table admin_docindex move;

可以在线重建索引组织表:alter table admin_docindex move online;

下面的命令在重建的过程同时修改了溢出数据段的表空间

alter table admin_docindex move tablespace admin_tbs2 overflow tablespace amdin_tbs3;

In this last statement, an index-organized table with a LOB column (CLOB) is created. Later, the table is moved with theLOB index and data segment being rebuilt and moved to a new tablespace.

CREATE TABLE admin_iot_lob
   (c1 number (6) primary key,
    admin_lob CLOB)
   ORGANIZATION INDEX
   LOB (admin_lob) STORE AS (TABLESPACE admin_tbs2);
.
.
.
ALTER TABLE admin_iot_lob MOVE LOB (admin_lob) STORE AS (TABLESPACE admin_tbs3); 

在索引组织表上创建二级索引

可以再索引组织表上创建二级索引来提供多访问路径,在iot上的二级索引在2方面不同于普通表上的索引。

1他们存储逻辑rowid,而不是物理rowid,因为b-tree索引本省的移动性导致了行没有永久的物理地址,如果一个行的物理地址改变了,它的逻辑地址仍然有效,这样,alter table....move这个维护操作不会是二级索引不可用。

2逻辑rowid包含物理猜测来标识行可能在的数据库块地址。如果物理猜测正确,一个二级索引扫描一但key找到了会发生一个额外的i/o,性能就像在普通表上的一个二级索引。

索引组织表上的二级索引有唯一,非唯一,函数索引,位图索引等。

在iot表上创建一个二级索引,下面的语句在docindex表上创建了一个二级索引,doc_id和token是键列。

create index doc_id_index on docindex(doc_id,token);在下面的查询上可以提高查询效率select token from docindex where doc_id=1;

二级索引为非主键列和非主键前缀列的访问提供了一个有效的方式,oracle通过基于主键的逻辑rowid组织二级索引。二级索引的访问顺序:

1没有物理猜测,包含两个索引扫描,一个二级索引扫描后面跟着一个主键索引扫描。

2有物理猜测,访问二级索引,然后是一个获取数据块的i/o

3有无效的物理猜测,访问二级索引,获取错误的数据块,接着是一个主键索引的扫描。


维护逻辑rowid中的物理猜测

逻辑rowid包含一个猜测,在猜测生成的时候来标识行在哪个块上,数据库使用猜测来直接搜寻块,而不是做全键的查询。然而,在新值插入后,猜测有可能会改变成无效,通过逻辑rowid的主键部分索引仍然可以使用,但是访问变的慢了。

使用dbms_stats包来监控猜测的是否无效,数据库监控有效性并在数据字典中记录有效猜测的百分比,这个值存储在dba_indexes中的pct_direct_access列。

为了获取新的猜测,你可以重建二级索引,重建二级索引会读基表,不像是普通表上的索引重建,一个快速,更轻量级的修复猜测的方法是使用alter index ..update block references语句。这个语句是在线的,dml仍然可以用。在重建完二级索引或使用alter index ..update更新完后,重新收集索引的信息。

位图索引

iot表上的位图索引也是支持的,需要mapping table的支持,通过在create table语句中指定mapping table来创建iot表,或是使用alter table命令来添加mapping table.

mapping表是一个存储逻辑rowid表的堆表,每一行存放相应iot表的行,因此maping表存放iot表的一对一的逻辑rowid和行的映射。在iot表上的位图索引和堆表是差不多的,除了iot位图索引把mappingtable作为基表。堆表与iot表,bitmap索引都是通过查询键来访问的,如果键找到了,位图索引转换成物理rowid,堆表通过这个rowid去访问基表,然而在iot表中,物理rowid用于访问maaping表,然后在通过locail rowid去访问iot表。

分析iot表,使用dbms_stats包来收集表的统计信息,dbms_stats包分析主键索引段也分析溢出数据段,计算包含表的逻辑信息也包含物理信息。

逻辑信息可以查询user_tables,all_tables或dba_tables来查看

可以查看物理信息使用user_indexes,all_indexes或dba_indexes;如

select last_analyzed,blevel,leaf_blocks,distinct_keys from dba_indexes where index_name='PK_ADMIN_DOCINDEX';

使用user_tables,all_tables或dba_table来查看溢出数据段的物理嘻嘻,如下面的查询:

select last_analyzed,num_rows,blocks,empty_blocks from dba_tables where iot_type='IOT_OVERFLOW' and iot_name='admin_docindex';

在iot表中使用orderby

如果在主键列或是主键列的前缀上使用orderby,那么就不需要额外的排序,因为主键列已经是拍好序的了,如果order by是在主键后缀,或是在非主键列上,那么额外的排序还是需要的。

可以使用oracle的imp/exp或是create table .. as select来讲iot表转化成常规的表:1使用常规路径导出iot表2创建和iot相同定义的表 3导入iot表,确保ignore=y。


Table 5-3 Comparison of Index-Organized Tables with Ordinary Tables

Ordinary TableIndex-Organized Table
Rowid uniquely identifies a row. Primary key can be optionally specifiedPrimary key uniquely identifies a row. Primary key must be specified
Physical rowid in ROWID pseudocolumn allows building secondary indexesLogical rowid in ROWID pseudocolumn allows building secondary indexes
Access is based on rowidAccess is based on logical rowid
Sequential scan returns all rowsFull-index scan returns all rows
Can be stored in a cluster with other tablesCannot be stored in a cluster
Can contain a column of the LONG datatype and columns of LOB datatypesCan contain LOB columns but not LONG columns

iot表的好处

通过主键或主键前缀访问iot表更快,非键列也在叶子块中,就避免了额外的块访问,行是顺序排列的,通过主键的范围访问也就更快。

为了更快的访问频繁访问的列,你可以使用溢出段来存放不经常访问的段。这样在叶子块中存放的行数就更多了,或是减少了b-tree的大小。

不像普通的堆表,主键存放在主键索引中和表中,在iot中,主键只在索引中。

iot表可能非常大,这可能毁坏clustering属性的密度。oracle提供overflow来解决这个问题,使用overflow,可以使用pctthreshold和including参数,来控制orcale怎么决定行是否分2部分来存储。使用pctthreshold你可以指定一个块大小的百分比,如果所有的非键列值满足指定的尺寸,行就不会分成2部分,否则从第一个不满足的非键列开始,后续的列都放在溢出数据段。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值