oracle有多個索引。分別是:1、「B*」數索引,能根據鍵提供一行或一個行集的快速存取;2、位圖索引,適用於高度重複且通常只讀的資料;3、基於函數的索引,將函數計算得到的結果儲存在行的欄位中;4、應用域索引,是自己建構和儲存的索引;5、HASH索引,使用該索引必須要使用HASH群集;6、分區索引,把一個索引分成多個片段。
本教學操作環境:windows10系統、Oracle 19c版本、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有多個索引嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!