oracle中有六種索引:1、「B*」數索引,能根據鍵提供一行或一個行集的快速存取;2、點陣圖索引,適用於高度重複而且通常唯讀的資料;3、基於函數的索引,將一個函數計算得到的結果儲存在行的列中;4、應用域索引,是自己構建和儲存的索引;5、HASH索引,使用該索引必須要使用HASH群集;6、分割區索引,把一個索引分成多個片斷。
本教學操作環境:windows10系統、Oracle 12c版、Dell G3電腦。
Oracle 提供了多種不同型別的索引以供使用。簡單地說, Oracle 中包括如下索引:
1、 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 將資料放在索引中之前,將先 把所儲存資料的位元組反轉,這樣原來可能在索引中相鄰放置的值在位元組反轉之後就會相距很遠。通過反轉位元組,對索引的插入就會分佈到多個塊上。
2、 點陣圖索引( bitmap index )
在一顆 B* 樹中,通常索引條目和行之間存在一種一對一的關係:一個 索引條目就指向一行。而對於點陣圖索引,一個索引條目則使用一個點陣圖同時指向多行。點陣圖索引適用於高度重複而且通常唯讀的資料(高度重複是指相對於表中的總行數,資料只有很少的幾個不同值)。考慮在一 個有 100 萬行的表中,每個列只有 3 個可取值: Y 、 N 和 NULL 。舉例來說,如果你需要頻繁地統計多少行有值Y ,這就很適合建立點陣圖索引。不過並不是說如果這個表中某一列有 11.000 個不同的值就不能建立點陣圖索引,這一列當然也可以建立 點陣圖索引。在一個 OLTP 資料庫中,由於存在並行性相關的問題,所以不能考慮使用點陣圖索引(後面我們就會討論這一點)。注意,點陣圖索引要求使用 Oracle 企業版或個人版。
點陣圖聯結索引( bitmap join index ):這為索引結構(而不是表)中的資料提供了一種逆規範化的 方法。例如,請考慮簡單的 EMP 和 DEPT 表。有人可能會問這樣一個問題: 「 多少人在位於波士頓的部門工作 ?「 EMP 有一個指向 DEPT 的外來鍵,要想統計 LOC 值為 Boston 的部門中的員工人數,通常必須完成表聯結,將 LOC 列聯結至 EMP 記錄來回答這個問題。通過使用點陣圖聯結索引,則可以在 EMP 表上對 LOC 列建立索引 。
3、 基於函數的索引( function-based index )
這些就是 B* 樹索引或點陣圖索引,它將一個函數計算得到的結果儲存在行的列中,而不是儲存列資料本身。可以把基於函數的索引看作一個虛擬列(或派生列)上的索引,換句話說,這個列並不物理儲存在表中。基於函數的索引可以用於加快形如 SELECT * FROM T W HERE FUNCTION(DATABASE_COLUMN) = SAME_VALUE 這樣的查詢,因為值 FUNCTION(DATABASE_COLUMN) 已經提前計算並儲存在索引中。
4、 應用域索引( application domain index )
應用域索引是你自己構建和儲存的索引,可能儲存在Oracle 中,也可能在 Oracle 之外。你要告訴優化器索引的選擇性如何,以及執行的開銷有多大,優化器則會根據你提供的資訊來決定是否使用你的索引。 Oracle 文字索引就是應用域索引的一個例子;你也可 以使用構建 Oracle 文字索引所用的工具來建立自己的索引。需要指出,這裡建立的 「 索引 「 不需要使用傳統的索引結構。例如, Oracle 文字索引就使用了一組表來實現其索引概念。
5、HASH索引
使用HASH索引必須要使用HASH群集。建立一個群集或HASH群集的同時,也就定義了一個群集鍵。這個鍵告訴Oracle如何在群集上儲存表。在儲存資料時,所有與這個群集鍵相關的行都被儲存在一個資料庫塊上。若資料都儲存在同一個資料庫塊上,並且使用了HASH索引,Oracle就可以通過執行一個HASH函數和I/O來存取資料——而通過適用一個二元高度為4的B-樹索引來存取資料,則需要在檢索資料時使用4個I/O。
技巧:HASH索引在有限制條件(需要指定一個確定的值而不是一個值範圍)的情況下非常有用。
6、分割區索引
分割區索引就是簡單地把一個索引分成多個片斷,這樣可以存取更小的片斷,並且可以把這些片斷分別存放在不同的硬碟上(避免I/O問題)。B-數索引和點陣圖索引都可以被分割區,HASH索引不可以被分割區。
有兩種型別的分割區索引:本地分割區索引和全域性分割區索引。每個型別都有兩個子型別,有字首索引和無字首索引。如果使用了點陣圖索引就必須是本地索引。
把索引分割區最主要的原因是可以減少所需讀取的索引的大小,另外把分割區放在不同的表空間中可以提高分割區的可用性和可靠性。
以上就是oracle有幾種索引的詳細內容,更多請關注TW511.COM其它相關文章!