oracle中有六種索引:1、“B*”數(shù)索引,能根據(jù)鍵提供一行或一個(gè)行集的快速訪問;2、位圖索引,適用于高度重復(fù)而且通常只讀的數(shù)據(jù);3、基于函數(shù)的索引,將一個(gè)函數(shù)計(jì)算得到的結(jié)果存儲在行的列中;4、應(yīng)用域索引,是自己構(gòu)建和存儲的索引;5、HASH索引,使用該索引必須要使用HASH群集;6、分區(qū)索引,把一個(gè)索引分成多個(gè)片斷。
本教程操作環(huán)境:windows10系統(tǒng)、Oracle 12c版、Dell G3電腦。
oracle有幾種索引
Oracle 提供了多種不同類型的索引以供使用。簡單地說, Oracle 中包括如下索引:
1、 B* 樹索引
這些是我所說的 “ 傳統(tǒng) “ 索引。到目前為止,這是 Oracle 和大多數(shù)其他數(shù)據(jù)庫中最常用的索引。
B* 樹的構(gòu)造類似于二叉樹,能根據(jù)鍵提供一行或一個(gè)行集的快速訪問,通常只需很少的讀操作就能找到正確的行。不過,需要注意重要的一點(diǎn), ” B* 樹 “ 中的 ” B “ 不代表二叉( binary ),而代表平衡( b alanced )。B* 樹索引并不是一顆二叉樹,這一點(diǎn)在介紹如何在磁盤上物理地存儲 B* 樹時(shí)就會了解到。 B* 樹索引有以下子類型:
索引組織表( index organized table ):索引組織表以 B* 樹結(jié)構(gòu)存儲。堆表的數(shù)據(jù)行是以一種無組織的方式存儲的(只要有可用的空間,就可以放數(shù)據(jù)),而 IOT 與之不同, IOT 中的數(shù)據(jù)要按主鍵的順序存儲和排序。對應(yīng)用來說, IOT 表現(xiàn)得與 “ 常規(guī) “ 表并無二致;需要使用 SQL 來正確地訪問 IOT 。 IOT 對信息獲取、空間系統(tǒng)和 OLAP 應(yīng)用最為有用。 IOT 在上一章已經(jīng)詳細(xì)地討論過。
B*樹聚簇索引( B*tree cluster index )這些是傳統(tǒng) B* 樹索引的一個(gè)變體(只是稍有變化)。 B* 樹聚簇索引用于對聚簇鍵建立索引(見第 11. 章中 “ 索引聚簇表 “ 一節(jié)),所以這一章不再討論。在傳統(tǒng) B* 樹中 ,鍵都指向一行;而 B* 樹聚簇不同,一個(gè)聚簇鍵會指向一個(gè)塊,其中包含與這個(gè)聚簇鍵相關(guān)的多行。
降序索引( descending index ):降序索引允許數(shù)據(jù)在索引結(jié)構(gòu)中按 “ 從大到小 “ 的順序(降序)排序,而不是按 ” 從小到大 “ 的順序(升序)排序。我們會解釋為什么降序索引很重要,并說明降序索引如何工作。
反向鍵索引( reverse key index ):這也是 B* 樹索引,只不過鍵中的字節(jié)會 “ 反轉(zhuǎn) “ 。利用反向鍵索引,如果索引中填充的是遞增的值,索引條目在索引中可以得到更均勻的分布。例如,如果使用一個(gè)序列來生成主鍵,這個(gè)序列將生成諸如 987500 、 987501 、 987502 等值。這些值是順序的,所以倘若使用一 個(gè)傳統(tǒng)的 B* 樹索引,這些值就可能放在同一個(gè)右側(cè)塊上,這就加劇了對這一塊的競爭。利用反向鍵, Oracl e則會邏輯地對 205789 、 105789 、 005789 等建立索引。 Oracle 將數(shù)據(jù)放在索引中之前,將先 把所存儲數(shù)據(jù)的字節(jié)反轉(zhuǎn),這樣原來可能在索引中相鄰放置的值在字節(jié)反轉(zhuǎn)之后就會相距很遠(yuǎn)。通過反轉(zhuǎn)字節(jié),對索引的插入就會分布到多個(gè)塊上。
2、 位圖索引( bitmap index )
在一顆 B* 樹中,通常索引條目和行之間存在一種一對一的關(guān)系:一個(gè) 索引條目就指向一行。而對于位圖索引,一個(gè)索引條目則使用一個(gè)位圖同時(shí)指向多行。位圖索引適用于高度重復(fù)而且通常只讀的數(shù)據(jù)(高度重復(fù)是指相對于表中的總行數(shù),數(shù)據(jù)只有很少的幾個(gè)不同值)??紤]在一 個(gè)有 100 萬行的表中,每個(gè)列只有 3 個(gè)可取值: Y 、 N 和 NULL 。舉例來說,如果你需要頻繁地統(tǒng)計(jì)多少行有值Y ,這就很適合建立位圖索引。不過并不是說如果這個(gè)表中某一列有 11.000 個(gè)不同的值就不能建立位圖索引,這一列當(dāng)然也可以建立 位圖索引。在一個(gè) OLTP 數(shù)據(jù)庫中,由于存在并發(fā)性相關(guān)的問題,所以不能考慮使用位圖索引(后面我們就會討論這一點(diǎn))。注意,位圖索引要求使用 Oracle 企業(yè)版或個(gè)人版。
位圖聯(lián)結(jié)索引( bitmap join index ):這為索引結(jié)構(gòu)(而不是表)中的數(shù)據(jù)提供了一種逆規(guī)范化的 方法。例如,請考慮簡單的 EMP 和 DEPT 表。有人可能會問這樣一個(gè)問題: “ 多少人在位于波士頓的部門工作 ?“ EMP 有一個(gè)指向 DEPT 的外鍵,要想統(tǒng)計(jì) LOC 值為 Boston 的部門中的員工人數(shù),通常必須完成表聯(lián)結(jié),將 LOC 列聯(lián)結(jié)至 EMP 記錄來回答這個(gè)問題。通過使用位圖聯(lián)結(jié)索引,則可以在 EMP 表上對 LOC 列建立索引 。
3、 基于函數(shù)的索引( function-based index )
這些就是 B* 樹索引或位圖索引,它將一個(gè)函數(shù)計(jì)算得到的結(jié)果存儲在行的列中,而不是存儲列數(shù)據(jù)本身??梢园鸦诤瘮?shù)的索引看作一個(gè)虛擬列(或派生列)上的索引,換句話說,這個(gè)列并不物理存儲在表中。基于函數(shù)的索引可以用于加快形如 SELECT * FROM T W HERE FUNCTION(DATABASE_COLUMN) = SAME_VALUE 這樣的查詢,因?yàn)橹?FUNCTION(DATABASE_COLUMN) 已經(jīng)提前計(jì)算并存儲在索引中。
4、 應(yīng)用域索引( application domain index )
應(yīng)用域索引是你自己構(gòu)建和存儲的索引,可能存儲在Oracle 中,也可能在 Oracle 之外。你要告訴優(yōu)化器索引的選擇性如何,以及執(zhí)行的開銷有多大,優(yōu)化器則會根據(jù)你提供的信息來決定是否使用你的索引。 Oracle 文本索引就是應(yīng)用域索引的一個(gè)例子;你也可 以使用構(gòu)建 Oracle 文本索引所用的工具來建立自己的索引。需要指出,這里創(chuàng)建的 “ 索引 “ 不需要使用傳統(tǒng)的索引結(jié)構(gòu)。例如, Oracle 文本索引就使用了一組表來實(shí)現(xiàn)其索引概念。
5、HASH索引
使用HASH索引必須要使用HASH群集。建立一個(gè)群集或HASH群集的同時(shí),也就定義了一個(gè)群集鍵。這個(gè)鍵告訴Oracle如何在群集上存儲表。在存儲數(shù)據(jù)時(shí),所有與這個(gè)群集鍵相關(guān)的行都被存儲在一個(gè)數(shù)據(jù)庫塊上。若數(shù)據(jù)都存儲在同一個(gè)數(shù)據(jù)庫塊上,并且使用了HASH索引,Oracle就可以通過執(zhí)行一個(gè)HASH函數(shù)和I/O來訪問數(shù)據(jù)——而通過適用一個(gè)二元高度為4的B-樹索引來訪問數(shù)據(jù),則需要在檢索數(shù)據(jù)時(shí)使用4個(gè)I/O。
技巧:HASH索引在有限制條件(需要指定一個(gè)確定的值而不是一個(gè)值范圍)的情況下非常有用。
6、分區(qū)索引
分區(qū)索引就是簡單地把一個(gè)索引分成多個(gè)片斷,這樣可以訪問更小的片斷,并且可以把這些片斷分別存放在不同的硬盤上(避免I/O問題)。B-數(shù)索引和位圖索引都可以被分區(qū),HASH索引不可以被分區(qū)。
有兩種類型的分區(qū)索引:本地分區(qū)索引和全局分區(qū)索引。每個(gè)類型都有兩個(gè)子類型,有前綴索引和無前綴索引。如果使用了位圖索引就必須是本地索引。
把索引分區(qū)最主要的原因是可以減少所需讀取的索引的大小,另外把分區(qū)放在不同的表空間中可以提高分區(qū)的可用性和可靠性。
推薦教程:《Oracle視頻教程》