Oracle 索引概述
Oracle 提供了多種不同類型的索引以供使用。簡單地說,Oracle 中包括如下索引:
B*樹索引:這些是我所說的“傳統(tǒng)“索引。到目前為止,這是 Oracle 和大多數(shù)其他數(shù)據(jù)庫中最常用
的索引。B*樹的構(gòu)造類似于二叉樹,能根據(jù)鍵提供一行或一個行集的快速訪問,通常只需很少的讀操作就
能找到正確的行。不過,需要注意重要的一點,”B*樹“中的”B“不代表二叉(binary),而 代 表 平 衡( balanced)。
B*樹索引并不是一顆二叉樹,這一點在介紹如何在磁盤上物理地存儲 B*樹時就會了解到。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)詳細地討論過。
B*樹聚簇索引(B*tree cluster index)這些是傳統(tǒng) B*樹索引的一個變體(只是稍有變化)。B*樹聚
簇索引用于對聚簇鍵建立索引(見第 11.章中“索引聚簇表“一節(jié)),所以這一章不再討論。在傳統(tǒng) B*樹中 ,
鍵都指向一行;而 B*樹聚簇不同,一個聚簇鍵會指向一個塊,其中包含與這個聚簇鍵相關(guān)的多行。
降序索引(descending index):降序索引允許數(shù)據(jù)在索引結(jié)構(gòu)中按“從大到小“的順序(降序)排
序,而不是按”從小到大“的順序(升序)排序。我們會解釋為什么降序索引很重要,并說明降序索引如
何工作。
反向鍵索引(reverse key index):這也是 B*樹索引,只不過鍵中的字節(jié)會“反轉(zhuǎn)“。利用反向鍵
索引,如果索引中填充的是遞增的值,索引條目在索引中可以得到更均勻的分布。例如,如果使用一個序
列來生成主鍵,這個序列將生成諸如 987500、987501、987502 等值。這些值是順序的,所以倘若使用一個
傳統(tǒng)的 B*樹索引,這些值就可能放在同一個右側(cè)塊上,這就加劇了對這一塊的競爭。利用反向鍵,Oracle
則會邏輯地對 205789、105789、005789 等建立索引。Oracle 將數(shù)據(jù)放在索引中之前,將先把所存儲數(shù)據(jù)
的字節(jié)反轉(zhuǎn),這樣原來可能在索引中相鄰放置的值在字節(jié)反轉(zhuǎn)之后就會相距很遠。通過反轉(zhuǎn)字節(jié),對索引
的插入就會分布到多個塊上。
位圖索引(bitmap index):在一顆 B*樹中,通常索引條目和行之間存在一種一對一的關(guān)系:一個索
引條目就指向一行。而對于位圖索引,一個索引條目則使用一個位圖同時指向多行。位圖索引適用于高度
重復(fù)而且通常只讀的數(shù)據(jù)(高度重復(fù)是指相對于表中的總行數(shù),數(shù)據(jù)只有很少的幾個不同值)。考慮在一個
有 100 萬行的表中,每個列只有 3 個可取值:Y、N 和 NULL。舉例來說,如果你需要頻繁地統(tǒng)計多少行有值
Y,這就很適合建立位圖索引。不過并不是說如果這個表中某一列有 11.000 個不同的值就不能建立位圖索
引,這一列當(dāng)然也可以建立位圖索引。在一個 OLTP 數(shù)據(jù)庫中,由于存在并發(fā)性相關(guān)的問題,所以不能考慮
使用位圖索引(后面我們就會討論這一點)。注意,位圖索引要求使用 Oracle 企業(yè)版或個人版。
位圖聯(lián)結(jié)索引(bitmap join index):這為索引結(jié)構(gòu)(而不是表)中的數(shù)據(jù)提供了一種逆規(guī)范化的方
法。例如,請考慮簡單的 EMP 和 DEPT 表。有人可能會問這樣一個問題:“多少人在位于波士頓的部門工作?
“EMP 有一個指向 DEPT 的外鍵,要想統(tǒng)計 LOC 值為 Boston 的部門中的員工人數(shù),通常必須完成表聯(lián)結(jié),
將 LOC 列聯(lián)結(jié)至 EMP 記錄來回答這個問題。通過使用位圖聯(lián)結(jié)索引,則可以在 EMP 表上對 LOC 列建立索引。
基于函數(shù)的索引(function-based index):這些就是 B*樹索引或位圖索引,它將一個函數(shù)計算得到
的結(jié)果存儲在行的列中,而不是存儲列數(shù)據(jù)本身。可以把基于函數(shù)的索引看作一個虛擬列(或派生列)上
的索引,換句話說,這個列并不物理存儲在表中。基于函數(shù)的索引可以用于加快形如 SELECT * FROM T WHERE
FUNCTION(DATABASE_COLUMN) = SAME_VALUE 這樣的查詢,因為值 FUNCTION(DATABASE_COLUMN)已經(jīng)提前計
算并存儲在索引中。
應(yīng)用域索引(application domain index):應(yīng)用域索引是你自己構(gòu)建和存儲的索引,可能存儲在
Oracle 中,也可能在 Oracle 之外。你要告訴優(yōu)化器索引的選擇性如何,以及執(zhí)行的開銷有多大,優(yōu)化器
則會根據(jù)你提供的信息來決定是否使用你的索引。Oracle 文本索引就是應(yīng)用域索引的一個例子;你也可以
使用構(gòu)建 Oracle 文本索引所用的工具來建立自己的索引。需要指出,這里創(chuàng)建的“索引“不需要使用傳統(tǒng)
的索引結(jié)構(gòu)。例如,Oracle 文本索引就使用了一組表來實現(xiàn)其索引概念。
轉(zhuǎn)載于:https://www.cnblogs.com/lbp0200/archive/2013/03/05/2944559.html
總結(jié)
以上是生活随笔為你收集整理的Oracle 索引概述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 精典的网吧常用批处理收集
- 下一篇: gawk手册