索引組織表(index organized table ,IOT)

pingley發表於2012-04-09
索引組織表(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/,如需轉載,請註明出處,否則將追究法律責任。

索引組織表(index organized table ,IOT)
請登入後發表評論 登入
全部評論

相關文章