Oracle索引原理

2021-08-03 23:28:03 字數 3026 閱讀 6326

乙個b樹索引只有乙個根節點,它實際就是位於樹的最頂端的分支節點。可以用下圖一來描述b樹索引的結構。其中,b表示分支節點,而l表示葉子節點。

對於分支節點塊(包括根節點塊)來說,其所包含的索引條目都是按照順序排列的(預設是公升序排列,也可以在建立索引時指定為降序排列)。每 個索引條目(也可以叫做每條記錄)都具有兩個字段。第乙個字段表示當前該分支節點塊下面所鏈結的索引塊中所包含的最小鍵值;第二個欄位為四個位元組,表示所 鏈結的索引塊的位址,該位址指向下面乙個索引塊。在乙個分支節點塊中所能容納的記錄行數由資料塊大小以及索引鍵值的長度決定。比如從上圖一可以看到,對於 根節點塊來說,包含三條記錄,分別為(0 b1)、(500 b2)、(1000 b3),它們指向三個分支節點塊。其中的0、500和1000分別表示這三個分支節點塊所鏈結的鍵值的最小值。而b1、b2和b3則表示所指向的三個分支節點塊的位址。

對 於葉子節點塊來說,其所包含的索引條目與分支節點一樣,都是按照順序排列的(預設是公升序排列,也可以在建立索引時指定為降序排列)。每個索引條目(也可以 叫做每條記錄)也具有兩個字段。第乙個字段表示索引的鍵值,對於單列索引來說是乙個值;而對於多列索引來說則是多個值組合在一起的。第二個字段表示鍵值所 對應的記錄行的rowid,該rowid是記錄行在表裡的實體地址。如果索引是建立在非分割槽表上或者索引是分割槽表上的本地索引的話,則該rowid占用6個位元組;如果索引是建立在分割槽表上的全域性索引的話,則該rowid占用10個位元組。

sql:

建立索引

create index idx_emp1_ename on emp1(ename);

建立唯一索引

create unique index idx_uq_emp1_empno on emp1(empno) tablespace mypl;

位圖(bitmap)索引是另外一種索引型別,它的組織形式與b樹索引相同,也是一棵平衡樹。與b樹索引的區別在於葉子節點裡存放索引條目的方式不同。從前面我們知道,b樹索引的葉子節點裡,對於表裡的每個資料行,如果被索引列的值不為空的,則會為該記錄行在葉子節點裡維護乙個對應的索引條目。 而位圖索引則不是這樣,其葉子節點裡存放的索引條目如下圖所示。

假設某個表t裡所有的記錄在列c1上只具有三個值:01、02和03。在表t的c1列上建立位圖索引以後,則葉子節點的內容如圖9-14所示。可以看到,位圖索引只有三個索引條目,也就是每個c1列的值對應乙個索引條目。位圖索引條目上還包含表裡第一條記錄所對應的rowid以及最後一條記錄所對應的rowid。索引條目的最後一部分則是由多個bit位所組成的bitmap,每個bit位就對應一條記錄。

位圖索引適合唯一值很少的列,也就是重複值很多的列

sql:

建立位圖索引

create bitmap index idx_bm_emp1_deptno on emp1(deptno);

使用hash索引必須要使用hash集群。建立乙個集群或hash集群的同時,也就定義了乙個集群鍵。這個鍵告訴oracle如何在集群上儲存表。在儲存 資料時,所有與這個集群鍵相關的行都被儲存在乙個資料庫塊上。如果資料都儲存在同乙個資料庫塊上,並且將hash索引作為where子句中的確切匹 配,oracle就可以通過執行乙個hash函式和i/o來訪問資料-- 而通過使用乙個二元高度為4的b樹索引來訪問資料,則需要在檢索資料時使用4個i/o。如圖2-5所示,其中的查詢是乙個等價查詢,用於匹配hash列和 確切的值。oracle可以快速使用該值,基於hash函式確定行的物理儲存位置。

hash索引可能是訪問資料庫中資料的最快方法,但它也有自身的缺點。集群鍵上不同值的數目必須在建立hash集群之前就要知道。需要在建立hash集群 的時候指定這個值。低估了集群鍵的不同值的數字可能會造成集群的衝突(兩個集群的鍵值擁有相同的hash值)。這種衝突是非常消耗資源的。衝突會造成用來 儲存額外行的緩衝溢位,然後造成額外的i/o。如果不同hash值的數目已經被低估,您就必須在重建這個集群之後改變這個值。alter cluster命令不能改變hash鍵的數目。

hash集群還可能浪費空間。如果無法確定需要多少空間來維護某個集群鍵上的所有行,就可能造成空間的浪費。如果不能為集群的未來增長分配好附加的空間,hash集群可能就不是最好的選擇。

如果應用程式經常在集群表上進行全表掃瞄,hash集群可能也不是最好的選擇。由於需要為未來的增長分配好集群的剩餘空間量,全表掃瞄可能非常消耗資源。

在實現hash集群之前一定要小心。您需要全面地觀察應用程式,保證在實現這個選項之前已經了解關於表和資料的大量資訊。通常,hash對於一些包含有序值的靜態資料非常有效。

技巧:hash索引在有限制條件(需要指定乙個確定的值而不是乙個值範圍)的情況下非常有用。

在這裡還是用字典來進行模擬,一般來說漢語字典中有幾種索引,如拼音、偏旁、筆畫等。字典本身的組織也是排序的,我記得一般是按照拼音排序的。這裡的拼音就是聚族索引。也就是說聚族索引的組織順序和資料本身的組織順序是一致的 ,這也解釋了資料庫中只能定義乙個聚族索引的原因,因為資料本身只能按一種方式進行排序。       那聚族索引有什麼特別的好處呢,這個好處就是在資料庫中執行查詢一批資料的語句會比較快,因為資料已經按照聚族索引排好序了,很少的io操作就可以將資料 從庫中取出。好比你在字典中查詢發音從從a到c的漢字,只需要查到a的開始頁和c的結束頁,中間的所有頁都符合查詢要求,不用再一頁一頁地查詢。

非聚族索引就好比字典裡的偏旁、筆畫索引,其 索引組織順序和資料組織順序不一致 ,因此非聚族索引可以建立多個。當查詢一條資料時,非聚族索引和聚族索引的效率相差不大,但查詢一批資料(n)時,非聚族索引需要的io可能是聚族索引的n倍,因為非聚族索引需要一條一條地進行查詢。

本文摘自

Oracle索引原理

乙個b樹索引只有乙個根節點,它實際就是位於樹的最頂端的分支節點。可以用下圖一來描述b樹索引的結構。其中,b表示分支節點,而l表示葉子節點。對於分支節點塊 包括根節點塊 來說,其所包含的索引條目都是按照順序排列的 預設是公升序排列,也可以在建立索引時指定為降序排列 每 個索引條目 也可以叫做每條記錄 ...

ORACLE 索引原理

乙個b樹索引只有乙個根節點,它實際就是位於樹的最頂端的分支節點。可以用下圖一來描述b樹索引的結構。其中,b表示分支節點,而l表示葉子節點。對於分支節點塊 包括根節點塊 來說,其所包含的索引條目都是按照順序排列的 預設是公升序排列,也可以在建立索引時指定為降序排列 每個索引條目 也可以叫做每條記錄 都...

Oracle索引原理

oracle提供了大量索引選項。知道在給定條件下使用哪個選項對於乙個應用程式的效能來說非常重要。乙個錯誤的選擇可能會引發死鎖,並導致資料庫效能急劇下降或程序終止。而如果做出正確的選擇,則可以合理使用資源,使那些已經執行了幾個小時甚至幾天的程序在幾分鐘得以完成,這樣會使您立刻成為一位英雄。這篇文章就將...