1. 程式人生 > >B樹索引、點陣圖索引、雜湊索引

B樹索引、點陣圖索引、雜湊索引

create table btree_test(id number,code varchar2(10));
create index idx_btree_test_id on btree_test(id,code);
select object_id from user_objects where object_name='IDX_BTREE_TEST_ID';
alter session set events 'immediate trace name treedump level 59097';
insert into btree_test values(null,null);
alter session set events 'immediate trace name treedump level 59097';

insert into btree_test values(null,'1');
alter session set events 'immediate trace name treedump level 59097';
insert into btree_test values(1,null);
alter session set events 'immediate trace name treedump level 59097';


然後檢視轉儲檔案,admin\資料庫名\udump
發現這樣的資訊:

*** 2013-07-19 14:56:41.827
----- begin tree dump
leaf: 0x140142c 20976684 (0: nrow: 0 rrow: 0)

----- end tree dump
*** 2013-07-19 14:56:54.480
----- begin tree dump
leaf: 0x140142c 20976684 (0: nrow: 1 rrow: 1)
----- end tree dump
*** 2013-07-19 14:57:08.139
----- begin tree dump
leaf: 0x140142c 20976684 (0: nrow: 2 rrow: 2)
----- end tree dump

nrow當前節點所含索引條目的數量(包括delete的條目)

rrow有效的索引條目的數量

可以發現:

插入null,null時,有效的索引條目為0
插入null,1時,   有效的索引條目為1

插入1,null時,   有效的索引條目為2

所以,複合索引只有當要插入的值全為Null時才不能放入存入索引中。

也可以這樣看:

 SELECT num_rows  FROM user_indexes t   WHERE t.index_name ='btree_test';


2.不適合鍵值較少的列(重複資料較多的列)。

     假如索引列TYPE有5個鍵值,如果有1萬條資料,那麼 WHERE TYPE = 1將訪問表中的2000個數據塊。
再加上訪問索引塊,一共要訪問大於200個的資料塊。
    如果全表掃描,假設10條資料一個數據塊,那麼只需訪問1000個數據塊,既然全表掃描訪問的資料塊
少一些,肯定就不會利用索引了。

3.前導模糊查詢不能利用索引(like '%XX'或者like '%XX%')
   假如有這樣一列code的值為'AAA','AAB','BAA','BAB' ,如果where code like '%AB'條件,由於前面是
模糊的,所以不能利用索引的順序,必須一個個去找,看是否滿足條件。這樣會導致全索引掃描或者全表掃
描。如果是這樣的條件where code like 'A % ',就可以查詢CODE中A開頭的CODE的位置,當碰到B開頭的
資料時,就可以停止查找了,因為後面的資料一定不滿足要求。這樣就可以利用索引了。

 
2.點陣圖索引


    就是用位圖表示的索引,對列的每個鍵值建立一個位圖,點陣圖索引適合只有幾個固定值的列,如性別、婚姻狀況、行政區等等。
    如test表中有state這樣一列,有10,20,30,40這四個固定值,例子資料如下: