1. 程式人生 > >Oracle索引——索引型別

Oracle索引——索引型別

Oracle 提供了多種不同型別的索引以供使用。簡單地說, Oracle 中包括如下索引: 

B* 樹索引

這些是我所說的 “ 傳統 “ 索引。到目前為止,這是 Oracle 和大多數其他資料庫中最常用的索引。 B* 樹的構造類似於二叉樹,能根據鍵提供一行或一個行集的快速訪問,通常只需很少的讀操作就能找到正確的行。不過,需要注意重要的一點, ” B* 樹 “ 中的 ” B “ 

不代表二叉( binary ),而代表平衡( b alanced )。B* 樹索引並不是一顆二叉樹,這一點在介紹如何在磁碟上物理地儲存 B* 樹時就會了解到。 B* 樹索引有以下子型別:

索引組織表( index organized table ):索引組織表以 B* 樹結構儲存。堆表的資料行是以一種無組織的方式儲存的(只要有可用的空間,就可以放資料),而 IOT 與之不同, IOT 中的資料要按主鍵的順序儲存和排序

。對應用來說, IOT 表現得與 “ 常規 “ 表並無二致;需要使用 SQL 來正確地訪問 IOT 。 IOT 對資訊獲取、空間系統和 OLAP 應用最為有用。 IOT 在上一章已經詳細地討論過。

B*樹聚簇索引( B*tree cluster index )這些是傳統 B* 樹索引的一個變體(只是稍有變化)。 B* 樹聚簇索引用於對聚簇鍵建立索引(見第 

11. 章中 “ 索引聚簇表 “ 一節),所以這一章不再討論。在傳統 B* 樹中 ,鍵都指向一行;而 B* 樹聚簇不同,一個聚簇鍵會指向一個塊,其中包含與這個聚簇鍵相關的多行

降序索引( descending index ):降序索引允許資料在索引結構中按 “ 從大到小 “ 的順序(降序)排序,而不是按 ” 從小到大 “ 的順序(升序)排序。我們會解釋為什麼降序索引很重要,並說明降序索引如何工作。

反向鍵索引( reverse key index ):這也是 B* 樹索引,只不過鍵中的位元組會 “ 反轉 “ 。利用反向鍵索引,如果索引中填充的是遞增的值,索引條目在索引中可以得到更均勻的分佈。例如,如果使用一個序列來生成主鍵,這個序列將生成諸如 987500 、 987501 、 987502 等值。這些值是順序的,所以倘若使用一 個傳統的 B* 樹索引,這些值就可能放在同一個右側塊上,這就加劇了對這一塊的競爭。利用反向鍵, Oracl e則會邏輯地對 205789 、 105789 、 005789 等建立索引。 Oracle 將資料放在索引中之前,將先 把所儲存資料的位元組反轉,這樣原來可能在索引中相鄰放置的值在位元組反轉之後就會相距很遠。通過反轉位元組,對索引的插入就會分佈到多個塊上。

    點陣圖索引( bitmap index 

在一顆 B* 樹中,通常索引條目和行之間存在一種一對一的關係:一個 索引條目就指向一行。而對於點陣圖索引,一個索引條目則使用一個位圖同時指向多行。點陣圖索引適用於高度重複而且通常只讀的資料(高度重複是指相對於表中的總行數,資料只有很少的幾個不同值)。考慮在一 個有 100 萬行的表中,每個列只有 個可取值: 、 和 NULL 。舉例來說,如果你需要頻繁地統計多少行有值,這就很適合建立點陣圖索引。不過並不是說如果這個表中某一列有 11.000 個不同的值就不能建立點陣圖索引,這一列當然也可以建立 點陣圖索引。在一個 OLTP 資料庫中,由於存在併發性相關的問題,所以不能考慮使用點陣圖索引(後面我們就會討論這一點)。注意,點陣圖索引要求使用 Oracle 企業版或個人版。

點陣圖聯結索引( bitmap join index ):這為索引結構(而不是表)中的資料提供了一種逆規範化的 方法。例如,請考慮簡單的 EMP 和 DEPT 表。有人可能會問這樣一個問題: “ 多少人在位於波士頓的部門工作 ?“ EMP 有一個指向 DEPT 的外來鍵,要想統計 LOC 值為 Boston 的部門中的員工人數,通常必須完成表聯結,將 LOC 列聯結至 EMP 記錄來回答這個問題。通過使用點陣圖聯結索引,則可以在 EMP 表上對 LOC 列建立索引 。

基於函式的索引( function-based index 

這些就是 B* 樹索引或點陣圖索引,它將一個函式計算得到的結果儲存在行的列中,而不是儲存列資料本身。可以把基於函式的索引看作一個虛擬列(或派生列)上的索引,換句話說,這個列並不物理儲存在表中。基於函式的索引可以用於加快形如 SELECT * FROM T W HERE FUNCTION(DATABASE_COLUMN) = SAME_VALUE 這樣的查詢,因為值 FUNCTION(DATABASE_COLUMN) 已經提前計算並存儲在索引中。

應用域索引( application domain index 

應用域索引是你自己構建和儲存的索引,可能儲存在Oracle 中,也可能在 Oracle 之外。你要告訴優化器索引的選擇性如何,以及執行的開銷有多大,優化器則會根據你提供的資訊來決定是否使用你的索引。 Oracle 文字索引就是應用域索引的一個例子;你也可 以使用構建 Oracle 文字索引所用的工具來建立自己的索引。需要指出,這裡建立的 “ 索引 “ 不需要使用傳統的索引結構。例如, Oracle 文字索引就使用了一組表來實現其索引概念。