表: 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博客 ” ,链接:https://blog.itpub.net/22034023/viewspace-717937/
,如需转载,请注明出处,否则将追究法律责任。