Oracle學習之 索引

2021-09-24 22:56:05 字數 2761 閱讀 2030

一、b-樹索引

簡述:

b-樹索引實現類似於倒置的樹型結構,包括根節點、分支節點和葉子節點,並且使用樹遍歷演算法來搜尋列值。葉子節點中包含一對(值、行編號)值,值對應於索引鍵列,行編號則表示行在表資料塊中的物理位置。分支節點包含葉子節點目錄以及儲存在其中的葉子節點的值範圍。根節點包含分支節點目錄以及這些分支節點所包括的值範圍。

下圖是乙個數值型別列的b-樹索引結構。為了便於理解,這張圖對索引結構進行了概括,實際的索引結構要複雜的多。索引的根節點儲存分支節點位址及分支塊中所訪問值的範圍。分支節點儲存葉子節點位址及葉子塊中的值範圍。

如果sql語句使用謂語n1=12000來查詢乙個列值12000,將會從根節點開始進行索引範圍掃瞄,遍歷到第2個分支節點,因為第2個分支節點儲存的值範圍為11001到22000。

然後遍歷第4個葉子節點,找到對應的行編號使用這個行編號從表中訪問到資料行。行編號是表資料塊中資料行物理位置的指標。

建立方式:

create index on (column_names);
適用範圍:1、 主鍵、唯一性約束

2、重複度非常低的字段

3、一定條件下不適用重複度非常高的字段

二、位圖索引

簡述:

顧名思義,與「位」有關。大家都知道,計算機中的所有資訊最終都是通過「位bit」來運算的, 二進位制位運算在計算機中是非常高效的。每乙個二進位制位都可以取值0或者1,而取值的確切含義是由具體的上下文環境決定的。在oracle點陣圖索引中,每乙個二進位制位代表了某一行中索引列的取值情況。例如,學生表中性別列的點陣圖索引結構如下:

男:0101001101

女:1010110010

在上面的點陣圖結構中,儲存了10條學生記錄的性別分布情況,以「男」性別為例,從左到右的第n個二進位制位代表了第n條記錄是否性別為男,如果二進位制位為1,代表true即性別為男,0代表false即性別不為男。以此類推,從圖中可以看出,第一條記錄的性別為女,第二條記錄的性別為男,…第九條記錄的性別為女,第十條記錄的性別為男。

建立方式:

create bitmap index on (column_name);
適用範圍:1、 適用較少唯一值的列進行唯讀運算

2、適用or\and這類邏輯操作

3、不適應於大量更新的列或較多dml(增、刪、改)操作的表

三、索引組織表

建立方式:

create table hb_product(...)  organization index ;
四、函式索引建立方式:

create index ind_char_xx on table (to_char(xx));
五、反向索引建立方式:

create index ind_rev_xx on table(xx) reverse;
等等還有其他一些索引,這裡不在體現。

六、看看索引失效情況:

1、聯合索引引導列後面的的字段組合走index skip scan(此索引有的版本不支援)

2、b-tree索引中單獨使用索引列is null不走索引(is not null走索引 index full scan),聯合索引中is null走索引(位圖索引 is null,is not null 都會走)

3、b-tree索引中索引列上使用函式或計算索引失效(可建立函式索引)

4、索引列上使用 != 、 <> 索引失效

5、索引列上使用not in(可以使用not exists替代not in)

6、使用like 『%a』 開頭不走索引

or會引起索引失效的說法是這樣來的:

如果是這樣乙個查詢

select * from tb where a=1 and b>2 and c<3 and d in (4,5,6)
並且在tb表上有這樣乙個索引:

create index inx_tb_abcd on tb (a,b,c,d)
那麼這個查詢可以用到這個索引

如果同樣是這個索引,查詢換成

select * from tb_ where a=1 or b>2 or c<3 or d in (4,5,6)
那麼這個查詢就用不到上面那個索引,因為結果集是幾個條件的並集,最多只能在查詢a=1的資料時用索引,其它幾個條件都需要表掃瞄,那優化器就會選擇直接走一遍表掃瞄,所以索引就失效了。

那麼像第二個查詢這樣的應該怎麼建索引呢,答案就是四個列上各建乙個索引,或者只在選擇性最高的列上建索引,比如a=1的資料量很少,就在a上建,如果d是4,5,6的資料很少,就在d上建,這樣優化器就會選擇先走索引查詢,再對找出的結果集進行篩選,掃瞄數就會大幅減少。

七、以下索引發生條件不同版本有不同的結果,需要實戰

oracle學習小結3之索引

今天歸納索引的常用操作 1 索引分為b樹索引和點陣圖索引 建立create index scott.event index on scott.event name pctfree 25 storage initial 500k tablespace system 如果是點陣圖索引,則create b...

oracle學習小結3之索引

今天歸納索引的常用操作 1 索引分為b樹索引和點陣圖索引 建立 create index scott.event index on scott.event name pctfree 25 storage initial 500k tablespace system 如果是點陣圖索引,則create ...

oracle 索引 之B TREE 索引

索引是oracle裡面的乙個非常重要的知識,oracle10g中索引可以分為以下 b tree indexes b tree cluster indexes hash cluster indexes reverse key indexes bitmap indexes bitmap join ind...