索引組織表(index organized table ,IOT)
索引組織表(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_.
相關文章
- 索引組織表(Index Organizied Table)索引Index
- Oracle Index-organized table (IOT)概述OracleIndexZed
- 簡述Oracle IOT(Index Organized Table)(上)OracleIndexZed
- 簡述Oracle IOT(Index Organized Table)(下)OracleIndexZed
- 簡述Oracle IOT(Index Organized Table)(中)OracleIndexZed
- Oracle 索引組織表(IOT)Oracle索引
- oracle iot索引組織表(一)Oracle索引
- oracle iot索引組織表(二)Oracle索引
- 資料庫表--index organized table資料庫IndexZed
- 在OLTP系統使用索引組織表IOT索引
- index table (IOT)Index
- Oracle堆組織表的索引和索引組織表Oracle索引
- oracle 索引組織表Oracle索引
- Index-Organized Table Applications (236)IndexZedAPP
- 索引組織表上建立BITMAP索引(三)索引
- 索引組織表上建立BITMAP索引(二)索引
- 索引組織表上建立BITMAP索引(一)索引
- ORACLE索引組織表討論Oracle索引
- 資料庫表--heap organized table資料庫Zed
- 資料庫表,索引(索引組織表,聚簇表,聚簇索引,)資料庫索引
- [20120324]IOT索引組織表相關資訊的學習(二).txt索引
- [20120509]IOT索引組織表相關資訊的學習(三).txt索引
- [20120509]IOT索引組織表相關資訊的學習(四).txt索引
- (轉)索引掃描還是全表掃描(Index Scan Or Full Table Scan)索引Index
- 轉)索引掃描還是全表掃描(Index Scan Or Full Table Scan)索引Index
- Oracle表table與索引index的分析及索引重建及統計資訊匯入匯出Oracle索引Index
- Overview of Index-Organized Tables (227)ViewIndexZed
- Benefits of Index-Organized Tables (229)IndexZed
- Partitioned Index-Organized Tables (234)IndexZed
- SQL Server 重新組織生成索引SQLServer索引
- 資料庫表--index clustered table資料庫Index
- [20151008]索引組織表上建立BITMAP索引.txt索引
- 查詢使用表空間的TABLE,INDEX,INDEX SUBPARTITIONIndex
- [20120228]IOT索引組織表相關資訊的學習.txt索引
- Bitmap Indexes on Index-Organized Tables (232)IndexZed
- table/index/LOBINDEX遷移表空間Index
- Oracle 堆組織表(HOT)Oracle
- 如何更改table及index的表空間Index