索引組織表(indexorganizedtable,IOT)

索引組織表(index organized table ,IOT)
默認(rèn)情況下所有的表都是堆組織表,對(duì)表中的記錄不進(jìn)行排序。堆組織表通過(guò)rowid 來(lái)訪問(wèn)(定位)表中的記錄。IOT 使用b-tree index 的結(jié)構(gòu)存儲(chǔ)記錄。邏輯上按照主鍵排序,和正常的主鍵索引不同的是,主鍵索引僅僅是存儲(chǔ)定義列的值。IOT index 存儲(chǔ)所有IOT表中所有的列,并按照主鍵排序。索引和表合二為一,存儲(chǔ)在同一個(gè)數(shù)據(jù)庫(kù)對(duì)象中。表中記錄的訪問(wèn)也不是通過(guò)傳統(tǒng)的rowid來(lái)現(xiàn)實(shí),而是通過(guò)主鍵來(lái)訪問(wèn)。
創(chuàng)建IOT
IOT中需要存在主鍵,并且在創(chuàng)建IOT的語(yǔ)句中使用organization index 子句。
創(chuàng)建一個(gè)堆組織表,并且給定主鍵約束的名稱方便后面的查找和標(biāo)識(shí)。
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.
查看剛才創(chuàng)建的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
堆組織表中的索引與主鍵的約束同名。下面這個(gè)查詢進(jìn)一步說(shuō)明堆組織表中索引所在的列。
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
查看因?yàn)閯?chuàng)建堆組織表產(chǎn)生的數(shù)據(jù)庫(kù)對(duì)象。
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
查看數(shù)據(jù)庫(kù)分配給堆組織表的segment。如果我們給主鍵約束起了名字
那么堆組織表的segment name 和主鍵約束的名稱相同,否則會(huì)使用
系統(tǒng)默認(rèn)的段名 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
堆組織表是沒(méi)有 table segment 的。
IOT 的優(yōu)勢(shì)
在SQL語(yǔ)句的查詢條件中經(jīng)常需要使用到表中的主鍵這種情況下使用IOT可以實(shí)現(xiàn)更好的性能更快的訪問(wèn)速度。另外索引和表合二為一,只用一個(gè)segment 并且不需要存儲(chǔ)rowid,只存儲(chǔ)一遍primary key values 所有可以節(jié)省存儲(chǔ)開(kāi)銷。
關(guān)于overflow area
如果在堆組織表中的一些列是不經(jīng)常訪問(wèn)的,或者記錄很長(zhǎng)應(yīng)該考慮使用overflow area.把這部分不常用的數(shù)據(jù)存放在overflow segment 中??梢允褂胕ndex segment 比較小,從而在檢索index segment 中的數(shù)據(jù)時(shí)性能更好。注:primary key values  總是存儲(chǔ)在index segment中的,no-key values 可以存儲(chǔ)在index segment 中也可以存儲(chǔ)在overflow segment 中。index segment 中的row通過(guò)rowid 來(lái)連接到overflow segment 中的row.所以select 與DML語(yǔ)句不能直接的訪問(wèn)overflow 中的數(shù)據(jù)。overflow segment 的類型是table not index.
創(chuàng)建帶overflow area 的IOT
首先來(lái)認(rèn)識(shí)兩個(gè)很重要的overflow 子句:
overflow pctthreshold 子句 : 指定index block 中保留的空間的百分比。該百分比需要設(shè)置的合理,以便能夠有足夠的空間來(lái)存放primary key values.其他的列,如果存儲(chǔ)在index block 中操作了指定的閥值,將不會(huì)存儲(chǔ)在index block 中,而是存儲(chǔ)在overflow segment 中。語(yǔ)法格式是:
pctthreshold threshold  
threshold in(1...50),默認(rèn)值是50.
overflow including 子句:指定那些列應(yīng)該存儲(chǔ)在index block 中。
語(yǔ)法格式是:
including column_name
這里的column_name 可以是最后一個(gè)primary key 列,也可以是no primary key 列。
創(chuàng)建一個(gè)帶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
查看由創(chuàng)建IOT 所生成的對(duì)象,這里因?yàn)槭褂昧薿verflow 所以
多出了一個(gè) 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
查看由創(chuàng)建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 與 對(duì)象名相同。

新聞名稱:索引組織表(indexorganizedtable,IOT)
標(biāo)題鏈接:http://bm7419.com/article48/igedhp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、Google、外貿(mào)建站微信公眾號(hào)、App開(kāi)發(fā)、商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)