只做等值查詢,索引鍵值順序怎麼建立好?

wei-xh發表於2012-03-07
表:   cs_ab01。
表大小:3G
表記錄數:        1000000000
key_aac001唯一值:1000000
key_aac002唯一值:200
1.表cs_ab01,key_aac001,key_aac002列只做等值查詢,key_aac001,key_aac002可能會一起出現,key_aac001可能單獨出現,怎麼建立索引?理由
2.表cs_ab01,key_aac001,key_aac002列總是一起出現在謂詞裡,key_aac001等值,key_aac002範圍查詢,怎麼建立索引?理由
3.表cs_ab01,key_aac001,key_aac002列總是做等值查詢,總是一起出現,該怎麼建立索引?理由
一個公司的面試題。第三個情形值得討論。
 
create table wxh_tbd (id number,name varchar2(4000));
insert /*+ append */ into wxh_tbd select rownum ,lpad('a',2000) from dba_objects;
commit;
insert /*+ append */ into wxh_tbd select rownum ,lpad('a',2000) from dba_objects;
commit;
create index t on wxh_tbd(name,id);
create index t1 on wxh_tbd(id,name);
 
Index                                      Leaf
Name                           BLV         Blks
------------------------------ --- ------------
T                                7       14,830
T1                               2       14,830
 
由於索引分支節點並不是儲存所有的索引鍵值,而是隻儲存必須的索引鍵值。
但是由於本例裡的name都一樣,因此索引分支節點裡必須再儲存object_id來區別。而且由於name欄位較長,就導致分支的節點數非常的多,於是就產生了belevel為7的索引樹。
看來把唯一值較多的放在索引鍵值的前面,這個準則還是有效的,只是大家可能只是知道這個準則,並不清楚為什麼。
但是無論是那種建立索引的方式,索引的葉子塊都是一樣的。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22034023/viewspace-717937/,如需轉載,請註明出處,否則將追究法律責任。

相關文章