新聞中心
在數(shù)據(jù)庫中,索引是指用于快速訪問數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),它允許數(shù)據(jù)庫服務(wù)器有效地查找特定條件下的數(shù)據(jù)行。隨著數(shù)據(jù)庫中數(shù)據(jù)量的增加,索引的作用越來越重要。Oracle數(shù)據(jù)庫是一種常見的企業(yè)級關(guān)系型數(shù)據(jù)庫管理系統(tǒng),其索引機(jī)制也非常成熟。本文將從原理圖的角度深入探討Oracle數(shù)據(jù)庫索引的原理和應(yīng)用。

一、索引的分類
在Oracle數(shù)據(jù)庫中,索引可以分為以下兩類:
1. 唯一索引:唯一索引指標(biāo)識表中每個數(shù)據(jù)行的屬性值都是唯一的。對于唯一索引,數(shù)據(jù)庫系統(tǒng)在索引中保存的是數(shù)據(jù)行的地址,以實(shí)現(xiàn)對數(shù)據(jù)行的快速訪問。
2. 非唯一索引:非唯一索引指表中不同的數(shù)據(jù)行可以擁有相同的屬性值。在非唯一索引中,數(shù)據(jù)庫系統(tǒng)會保存多個數(shù)據(jù)行的地址。
二、Oracle數(shù)據(jù)庫索引的實(shí)現(xiàn)原理
在Oracle數(shù)據(jù)庫中,索引實(shí)際上是一個B樹結(jié)構(gòu)。B樹是一種平衡樹,通過在節(jié)點(diǎn)中存放多個數(shù)據(jù)行的地址,可以實(shí)現(xiàn)對數(shù)據(jù)行的快速訪問。B樹的平衡性可以保證在索引中查找數(shù)據(jù)時的效率。此外,B樹的根節(jié)點(diǎn)和所有葉節(jié)點(diǎn)的深度相同,因此對于任何查詢條件,查找時間始終保持對數(shù)的級別。
三、Oracle數(shù)據(jù)庫索引的應(yīng)用
在Oracle數(shù)據(jù)庫中,索引可以應(yīng)用到以下幾個方面:
1. 提高查詢效率:在查詢大型表中的數(shù)據(jù)時,使用索引可以大大提高查詢效率。通過基于索引來查找數(shù)據(jù)行,可以避免在整個表中掃描數(shù)據(jù)行的情況,從而節(jié)省查詢時間。
2. 加速排序:Oracle數(shù)據(jù)庫可以利用索引來加速排序操作。當(dāng)需要按照某個屬性值對表中數(shù)據(jù)行進(jìn)行排序時,Oracle數(shù)據(jù)庫會在屬性值上建立索引,并利用這個索引來實(shí)現(xiàn)排序操作。
3. 唯一性檢查:在Oracle數(shù)據(jù)庫中,唯一索引可以用來檢查屬性值的唯一性。當(dāng)插入一條新數(shù)據(jù)行時,數(shù)據(jù)庫系統(tǒng)會檢查新數(shù)據(jù)行的屬性值是否與已經(jīng)存在的數(shù)據(jù)行的屬性值相同。如果屬性值已經(jīng)存在于索引中,數(shù)據(jù)庫系統(tǒng)就會拒絕插入這條數(shù)據(jù)行。
4. 建立約束:在Oracle數(shù)據(jù)庫中,索引可以用來建立約束。例如,設(shè)置唯一索引可以強(qiáng)制表中每個數(shù)據(jù)行的屬性值是唯一的,這樣可以保證不會出現(xiàn)重復(fù)數(shù)據(jù)。
四、Oracle數(shù)據(jù)庫索引的優(yōu)化
針對Oracle數(shù)據(jù)庫索引的優(yōu)化,可以從以下幾個方面進(jìn)行考慮:
1. 選擇合適的索引類型:在創(chuàng)建索引時,應(yīng)選擇合適的索引類型。如果表中某個屬性的取值較為唯一,應(yīng)當(dāng)使用唯一索引來確保屬性值的唯一性。如果屬性值分布比較均勻,就應(yīng)當(dāng)使用非唯一索引來提高索引的效率。
2. 合理的索引列數(shù)量:在創(chuàng)建索引時,應(yīng)避免創(chuàng)建過多的索引列。如果索引列數(shù)量過多,就容易影響數(shù)據(jù)庫的執(zhí)行效率。
3. 定期維護(hù)索引:應(yīng)當(dāng)定期維護(hù)索引,包括對索引進(jìn)行重建和重新統(tǒng)計(jì)。重建索引可以優(yōu)化索引的存儲結(jié)構(gòu)和使用效率,而重新統(tǒng)計(jì)索引可以保證Oracle數(shù)據(jù)庫根據(jù)最新情況對索引進(jìn)行優(yōu)化。
4. 消除重復(fù)索引:在某些情況下,同一個表可能會存在多個索引,這些索引可能會有重復(fù)的部分。這種情況下,應(yīng)當(dāng)考慮刪除其中部分索引,以避免出現(xiàn)冗余的索引結(jié)構(gòu)。
五、
本文深入分析了Oracle數(shù)據(jù)庫索引的原理和應(yīng)用技巧。在數(shù)據(jù)量龐大的情況下,索引的作用非常明顯。通過合理的索引設(shè)計(jì)和優(yōu)化,可以大大提高數(shù)據(jù)庫系統(tǒng)的性能。在這一點(diǎn)上,建議開發(fā)人員對Oracle數(shù)據(jù)庫索引深入理解,以更好地利用索引機(jī)制來優(yōu)化數(shù)據(jù)庫性能。
相關(guān)問題拓展閱讀:
- oracle的索引有幾種
- oracle sql優(yōu)化涉及哪些原理
oracle的索引有幾種
Oracle 提供了多種不同類型的索引以供使用。簡單地說, Oracle 中包括如下索引:
1、 B* 樹索引
這些是我所說的 “ 傳統(tǒng) “ 索引。到目前為止,這是 Oracle 和大多數(shù)其他數(shù)據(jù)庫中最常用的索引。 B* 樹的構(gòu)造類似于二叉樹,能根據(jù)鍵提供一行或一個行集的快速訪問,通常只需很少的讀操作就能找到正確的行。不過,需要注意重要的一點(diǎn), ” B* 樹 “ 中的 ” B “ 不代表二叉( binary ),而代表平衡( b alanced )。B* 樹索引并不是一顆配世腔二叉樹,這一點(diǎn)在介紹如何在磁盤上物理地存儲 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)詳細(xì)地討論過。
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) “ 。利用反向鍵索引,如果索引中填充的是遞增的值,索引條目在索引中可以得到更均勻的分布。例如,如果使用一個序列來生成主鍵,這個序列將生成諸如、、等值。這些值是順序的,所以倘若使用一 個傳統(tǒng)的 B* 樹索引,這些值就返仔可能放在同一個右側(cè)塊上,這就加劇了對這一塊的競爭。利用反向鍵, Oracl e則會邏輯地對、、等建立索引。 Oracle 將數(shù)據(jù)放在索引中之前,將先 把所存儲數(shù)據(jù)的字節(jié)反轉(zhuǎn),這樣原來可能在索引中相鄰放置的值在字節(jié)反轉(zhuǎn)之后就會相距很遠(yuǎn)。通過反轉(zhuǎn)字節(jié),對索引的插入就會分布到多個塊上。
2、 位圖索引( bitmap index )
在一顆 B* 樹中,通常索引條目和行之間存在一種一對一的關(guān)系:一個 索引條目就指向一行。而對于位圖索引,一個索引條目則使用一個位圖同時指向多行。位圖索引適用于高度重復(fù)而且通常只讀的數(shù)據(jù)(高度重復(fù)是指相對于表中的總行數(shù),數(shù)據(jù)只有很少的幾個不同值)??紤]在一 個有 100 萬行的表中,每個列只有 3 個可取值: Y 、 N 和 NULL 。舉例來說,如果你需要頻繁地統(tǒng)計(jì)多少行有值Y ,這就很適合建立位圖索引。不過并不是說如果這個表中某一列有 11.000 個不同的值就不能建立位圖索引,這一列當(dāng)然也可以建立 位圖索引。在一個 OLTP 數(shù)據(jù)庫中,由于存在并發(fā)性相關(guān)的問題,所以不能考慮使用位圖索引(后面我們就會討論這一點(diǎn))。注意,位圖索引要求使用 Oracle 企業(yè)版或個人版。
位圖聯(lián)結(jié)索引( bitmap join index ):這為索引結(jié)構(gòu)(而不是表)中的數(shù)據(jù)提供了一種逆規(guī)范化的 方法。例如,請考慮簡單的 EMP 和 DEPT 表。有人可能會問這樣一個問題: “ 多少人在位于波士頓的部門工作 ?“ EMP 有一個指向 DEPT 的外鍵,要想統(tǒng)計(jì) LOC 值為 Boston 的部門中的員工人數(shù),通常必須完成表聯(lián)結(jié),將 LOC 列聯(lián)結(jié)至 EMP 記錄來回答這個問題。通過使用位圖聯(lián)結(jié)索引,則可以在 EMP 表上對 LOC 列建立索引 。
3、 基于函數(shù)的索引( function-based index )
這些就是 B* 樹索引或位圖索引,它將一個函數(shù)計(jì)算得到的結(jié)果存儲在行的列中,而不是存儲列數(shù)據(jù)本身??梢园鸦诤瘮?shù)的索引看作一個虛擬列(或派生列)上的索引,換句話說,這個列并不物理存儲在表中?;诤瘮?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òu)建 Oracle 文本索引所用的工具來建立自己的索引。需要指出,這里創(chuàng)建的 “ 索引 “ 不需要使用傳統(tǒng)的索引結(jié)構(gòu)。例如, Oracle 文本索引就使用了一組表來實(shí)現(xiàn)其索引概念。
5、HASH索引
使用HASH索引必須要使用HASH群集。建立一個群集或HASH群集的同時,也就定義了一個群集鍵。這個鍵告訴Oracle如何在群集上存儲表。在存儲數(shù)據(jù)時,所有與這個群集鍵相關(guān)的行都被存儲在一個數(shù)據(jù)庫塊上。若數(shù)據(jù)都存儲在同一個數(shù)據(jù)庫塊上,并且使用了HASH索引,Oracle就可以通過執(zhí)行一個HASH函數(shù)和I/O來訪問數(shù)據(jù)——而通過適用一個二元高度為4的B-樹索引來訪問數(shù)據(jù),則需要在檢索數(shù)據(jù)時使用4個I/O。
技巧:HASH索引在有限制條件(需要指定一個確定的值而不是一個值范圍)的情況下非常有用。
6、分區(qū)索引
分區(qū)索引就是簡單地把一個索引分成多個片斷,這樣可以訪問更小的片斷,并且可以把這些片斷分別存放在不同的硬盤上(避免I/O問題)。B-數(shù)索引和位圖索引都可以被分區(qū),HASH索引不可以被分區(qū)。
有兩種類型的分區(qū)索引:本地分區(qū)索引和全局分區(qū)索引。每個類型都有兩個子類型,有前綴索引和無前綴索引。如果使用了位圖索引就必須是本地索引。
把索引分區(qū)最主要的原因是可以減少所需讀取的索引的大小,另外把分區(qū)放在不同的表空間中可以提高分區(qū)的可用性和可靠性。
oracle sql優(yōu)化涉及哪些原理
B 樹索引(B-Tree索引)
B樹索引是我們在oracle數(shù)據(jù)庫中最常用的索引,在詳細(xì)介紹訪問方法之前,我們看一下B-TREE索引的結(jié)構(gòu)(圖片來源網(wǎng)絡(luò))
oracle的B樹索引就好像一顆長到的樹,他包含兩種類型,一種是索引分支塊(根節(jié)點(diǎn)塊,分支節(jié)點(diǎn)塊)一種是索引葉子塊(葉子節(jié)點(diǎn)塊)。分節(jié)點(diǎn)用來搜索,葉子節(jié)點(diǎn)用來存儲數(shù)據(jù)。根節(jié)點(diǎn)存儲索引的低層分支節(jié)點(diǎn)的數(shù)據(jù)。 由于所有的葉子節(jié)點(diǎn)均會自動的存儲成相同的深度,所以稱為“平 衡樹索引”, 故此,從任何葉子處檢索數(shù)據(jù)消耗的時間都是相同的。
對于分支節(jié)點(diǎn)塊(包括根節(jié)點(diǎn)塊)來說,其所包含的索引條目都是按照順序排列的(缺省是升序排列,也可以在創(chuàng)建索引時指定為降序排列)。每個索引條目(也可以叫做每條記錄)都具有兩個字段。之一個字段表示當(dāng)前該分支節(jié)點(diǎn)塊下面所鏈接的索引塊中所包含的最小鍵值;第二個字段為四個字節(jié),表示所鏈接的索引塊的地址,該地址指向下面一個索引塊。 比如從上圖一可以看到,對于根節(jié)點(diǎn)塊來說,包含三條記錄,分別為(0 B1)、(500 B2)、(1000 B3),它們指向耐賣三個分支節(jié)點(diǎn)塊。其中的0、500和1000分別表示這三個分支節(jié)點(diǎn)塊所鏈接的鍵值的最小值。而B1、B2和B3則表示所指向的三個分支節(jié)點(diǎn)塊的地址。在一個分支節(jié)點(diǎn)塊中 所能容納的記錄 行數(shù)由數(shù)據(jù)塊大小以及索引鍵值的長度決定。
對于葉子節(jié)點(diǎn)塊來說,其所包含的索引條目與分支節(jié)點(diǎn)一樣,都是按照順序排列的(缺省是升序排列,也可以在創(chuàng)建索引時指定為降序排列)。每個索引條目(也可以叫做每條記錄)也具有兩個字段。之一個字段表示索引的鍵值,對于單列索引來說是一個值;而對于多列索引來說則是多個值組合在一起的。第二個字段表示鍵值所對應(yīng)的記錄行的ROWID,該ROWID是記錄行在表里的物理地址。
當(dāng)用戶創(chuàng)建索引時,Oracle 取得所有被索引列的數(shù)據(jù)并進(jìn)行排序,之后將排序后索引值和與此值相對應(yīng)的 rowid 按照從下到上的順序加載到索引中。例如,以下語句:
view plain copy print?在CODE上查看代碼片派生到我的代碼片
CREATE INDEX employees_last_name ON employees(last_name);
Oracle 先將 employees 表按 last_name 列排序,再將排序后的 列及相應(yīng)的 rowid 按從下到上的順序加載到索引中。使用此索引時,Oracle 可以快速地搜索已排序的 last_name 值,并使用相應(yīng)的 rowid 去定位包含用戶所查找的 last_name 值的數(shù)據(jù)行。
在一個平衡樹索引中,更底層的索引塊(葉塊)存儲了被索引的數(shù)據(jù)值,以及對應(yīng)的
rowid。葉塊之間以雙向鏈表的形式相互連接。位于葉塊之上的分支塊中包含了
指向下層索引塊的指針。
oracle數(shù)據(jù)庫索引原理圖的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于oracle數(shù)據(jù)庫索引原理圖,Oracle數(shù)據(jù)庫索引:深入理解原理圖,oracle的索引有幾種,oracle sql優(yōu)化涉及哪些原理的信息別忘了在本站進(jìn)行查找喔。
創(chuàng)新互聯(lián)服務(wù)器托管擁有成都T3+級標(biāo)準(zhǔn)機(jī)房資源,具備完善的安防設(shè)施、三線及BGP網(wǎng)絡(luò)接入帶寬達(dá)10T,機(jī)柜接入千兆交換機(jī),能夠有效保證服務(wù)器托管業(yè)務(wù)安全、可靠、穩(wěn)定、高效運(yùn)行;創(chuàng)新互聯(lián)專注于成都服務(wù)器托管租用十余年,得到成都等地區(qū)行業(yè)客戶的一致認(rèn)可。
網(wǎng)站題目:Oracle數(shù)據(jù)庫索引:深入理解原理圖(oracle數(shù)據(jù)庫索引原理圖)
轉(zhuǎn)載來源:http://fisionsoft.com.cn/article/djgepgg.html


咨詢
建站咨詢
