B樹索引、點陣圖索引、雜湊索引
阿新 • • 發佈:2019-02-03
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這四個固定值,例子資料如下:
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這四個固定值,例子資料如下: