Oracle Index-organized table (IOT)概述

keeptrying發表於2012-05-29

一、幾種表型別

 

Type

Description

Ordinary(heap-organized) table

Data is stored as an unordered collection (heap).

Partitioned table

Data is divided into smaller, more manageable pieces.

Index-organized table (IOT)

Data (including no-key values) is sorted an stored in a B-tree index structure.

Clustered table

Related data from more than one table are stored together.

 

 

二、heap-organized table Index-organized table對比

 

不同於heap-organized table,資料以無序堆形式儲存,IOT中的資料按主鍵排序的方式儲存在B-tree索引結構中。除了儲存主鍵列值之外,IOTB-tree的每個索引條目還儲存非鍵列值(non-key column)。

Index-organized table具備完整的表功能。它們支援各種功能,如:約束條件、觸發器、LOGobject columns,分割槽、並行操作、聯機重組以及複製。甚至可以對索引組織的表建立索引

索引組織表與普通表只是在屋裡組織結構上有差別。邏輯上,其處理方式與普通表相同。可以像指定常規表那樣,在INSERTSELECTDELETEUPDATE語句中指定按索引組織的表。

Index-organized table非常適合OLTP應用程式。這類應用程式要求基於primary key實現快速訪問和高可用性。在聯機訂單處理中,對訂單表執行的查詢和DML操作主要就是基於主鍵,而大量的DML操作會產生碎片,因而需要頻繁的進行重組。由於IOT可以聯機重組,並且不會使其二級索引失敗,因此可以極大地縮短甚至消除不可用的時間段。

 

與堆表相比,IOT:可以基於主鍵更快地訪問表資料

                  不會複製主鍵值的儲存區

                  要求的儲存空間更少

                  使用二級索引和邏輯ROW ID

                  可用性更高,因為表重組時不會使二級索引失效

 

IOT有一下限制:必須有一個不是DEFERRABLE的主鍵

                不能聚簇

                不能使用組合分割槽

                不能包含型別為ROWIDLONG的列

 

Index-organized table沒有物理ROWID,而是使用邏輯row ID。邏輯row IDIndex-organized table提供更快的訪問,通過使用一下兩種方法:

l   A physical guess whose access time is equal to that of physical row IDs.(物理推測法,其訪問時間相當於對物理ROWID的訪問時間)

l   Access without the guess (or after an incorrect guess); this performs a primary key access of the IOT.(不推測或在推測錯誤後訪問,這將對IOT執行主鍵訪問)

 

推測的基礎是對行所在的檔案和塊的瞭解。如果建立了索引,則塊資訊比較準確,但如果葉塊發生了拆分,則該資訊會改變。如果推測錯誤,且該行已不在指定的塊中,則將使用邏輯ROW ID條目的剩餘部分(即主鍵)來獲取該行。

Oracle使用基於表主鍵的邏輯ROW ID來對Index-organized table編制二級索引。由於IOT中的行沒有永久性實體地址,因此當行轉移到新塊中後,物理推測也會失效。此時,要獲取新的推測,可以重建二級索引。

 

 

三、建立Index-organized table

 

create table indexTable

( ID varchar2(10),

   Name varchar2(20),

   constraint pk_id primary key(ID)

)

organization index

tablespace index

PCTTHRESHOLD 20

OVERFLOW TABLESPACE users

INCLUDING name;

 

1、 建立IOT時,必須設定主鍵,否則報錯。

2、 索引組織表實際上將所有資料都放入了索引中

3、 OVERFLOW子句(行溢位),因為所有資料都放入索引,所以當表的資料量很大時,會降低索引組織表的查詢效能。此時設定溢位段將主鍵和溢位資料分開來儲存以提高效率。溢位段的設定有兩種格式:

PCTTHRESHOLD n:指定一個資料塊的百分比,當行資料佔用大小超出時,該行的其他列資料放入溢位段。

INCLUDING column_name:指定列之前的列都放入索引塊,之後的列都放到溢位段。

如上所示,name之後的列必然被放入溢位列,而其他列根據PCTTHRESHOLD規則。

4、 compress子句(鍵壓縮)。與普通的索引一樣,索引組織表也可以使用compress子句進行鍵壓縮以消除重複值。具體的操作是,在organization index之後加上COMPRESS n子句。

n的意義在於:指定壓縮的列數。預設為無窮大。例如:對於資料(1,2,3)、(1,2,4)、(12,5)、(1,3,4)、(1,3,5),若使用COMPRESS,則會將重複出現的(1,2)、(1,3)進行壓縮;若使用COMPRESS 1時,只對資料(1)進行壓縮

5、 索引組織表的主鍵不能被刪除、禁用或延遲

 

四、Index-organized table上建立Bitmap索引

Oracle supports bitmap indexes on partitioned and nonpartitioned index-organized tables. A mapping table is required for creating bitmap indexes on an index-organized table.

--可以再Index-organized table上建立bitmap索引,但是需要建立mapping table

The mapping table is a heap-organized table that stores logical rowids of the index-organized table. Specifically, each mapping table row stores one logical rowid for the corresponding index-organized table row. Thus, the mapping table provides one-to-one mapping between logical rowids of the index-organized table rows and physical rowids of the mapping table rows.

--mapping tableheap-organized tablemapping table儲存Index-organized table的邏輯ROW ID。特別的,每一個mapping table行儲存一個相應IOT 行的邏輯ROW ID。這樣,mapping table就提供了一對一的mapping,在IOT的邏輯ROW IDmapping table的物理ROWID之間。

A bitmap index on an index-organized table is similar to that on a heap-organized table except that the rowids used in the bitmap index on an index-organized table are those of the mapping table as opposed to the base table. There is one mapping table for each index-organized table and it is used by all the bitmap indexes created on that index-organized table.

--IOT上的bitmap索引的ROWIDmapping table的,而不是base table的。

一個mapping table對應於一個IOTIOT上所有的bitmap index都用這一個mapping table

In both heap-organized and index-organized base tables, a bitmap index is accessed using a search key. If the key is found, the bitmap entry is converted to a physical rowid. In the case of heap-organized tables, this physical rowid is then used to access the base table. However, in the case of index-organized tables, the physical rowid is then used to access the mapping table. The access to the mapping table yields a logical rowid. This logical rowid is used to access the index-organized table.

--heap-organized tableIOT上,bitmap都是通過鍵值訪問,當一個鍵值被發現時,bitmap條目就轉換為一個物理ROWID。在heap-organized table的情況下,這一物理ROWID被用來訪問基表。然而,在IOT的情況下,物理ROWID被用來訪問mapping table,通過對mapping table的訪問,產生出一個邏輯ROW ID,這個邏輯ROW ID被用來訪問IOT

Though a bitmap index on an index-organized table does not store logical rowids, it is still logical in nature.

Movement of rows in an index-organized table does not leave the bitmap indexes built on that index-organized table unusable. Movement of rows in the index-organized table does invalidate the physical guess in some of the mapping table's logical rowid entries. However, the index-organized table can still be accessed using the primary key.

--IOT上的行移動不會導致其上的bitmap 索引失效。

--IOT上的行移動會使mapping table上的邏輯ROW ID條目的物理推測失效。然而,IOT依然可以通過主鍵來訪問。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25744374/viewspace-731398/,如需轉載,請註明出處,否則將追究法律責任。

相關文章