现在的位置: 首页 > 综合 > 正文

oracle中各种索引的总结

2013年08月01日 ⁄ 综合 ⁄ 共 3788字 ⁄ 字号 评论关闭

索引在ORACLE SQL-TUNNING中起着重要作用,索引分为B-TREE索引,BITMAP索引两大类,但是特别需要强调的就是索引组织表,clustering这两种最特别的索引!其中用的最多还是B-TREE索引。

1.        B-TREE索引
B-TREE索引是我们平时用的最多,B-TREE顾名思义就是类似树结构,我想学过计算机的同学都应该理解。每个叶子节点存储的格式为:
键值        ROWID
因为在ORACLE数据库中,根据rowid读取数据的速度是最快的。ORACLE先到内存中读取这个ROWID,然后到物理上读取这个ROWID。
a)                UNIQUE INDEXES
唯一索引不仅仅包含unique属性,还包含索引的特性。特别在PRIMARY KEY的时候,我们一般都选择UNIQUE INDEX。
b)                IMPLICIT INDEXES
隐含索引(我不知道,我这样的翻译是否正确),当我们在平时在运行类似一下语句的时候:
Create table vogts(id number,name varchar2(20),address varchar2(300));
ORACLE自动在后台创建一个隐含的索引。
c)        CONCATENATED INDEXES
多重索引。就是将多个字段组合在一起,组成一个索引。但是在组成索引的时候,也必须按照顺序来查询。
测试结果如下:
创建表和索引:
SQL> create table vogts(id number,name varchar2(20),address varchar2(300));

表已创建。
SQL> create index idx_vogts on vogts(id,name);

索引已创建。
插入数据:
SQL> insert into vogts values('1','vogts','hangzhou');

已创建 1 行。

SQL> commit;
二种不同方式查询,即按照:(1)ID查询;(2)
SQL> select id from vogts where id=1 and name = 'vogts';

        ID                                                                     
----------                                                                     
         1                                                                     

执行计划
----------------------------------------------------------                     
Plan hash value: 3883664107                                                     
                                                                                
------------------------------------------------------------------------------  
| Id  | Operation        | Name      | Rows  | Bytes | Cost (%CPU)| Time     |  
------------------------------------------------------------------------------  
|   0 | SELECT STATEMENT |           |     1 |     9 |     1   (0)| 00:00:01 |  
|*  1 |  INDEX RANGE SCAN| IDX_VOGTS |     1 |     9 |     1   (0)| 00:00:01 |  
------------------------------------------------------------------------------  
                                                                                
Predicate Information (identified by operation id):                             
---------------------------------------------------                             
                                                                                
   1 - access("ID"=1 AND "NAME"='vogts')                                       

SQL> select id from vogts where name = 'vogts';

        ID                                                                     
----------                                                                     
         1                                                                     

执行计划
----------------------------------------------------------                     
Plan hash value: 2527835214                                                     
                                                                                
------------------------------------------------------------------------------  
| Id  | Operation        | Name      | Rows  | Bytes | Cost (%CPU)| Time     |  
------------------------------------------------------------------------------  
|   0 | SELECT STATEMENT |           |     1 |     9 |     1   (0)| 00:00:01 |  
|*  1 |  INDEX SKIP SCAN | IDX_VOGTS |     1 |     9 |     1   (0)| 00:00:01 |  
------------------------------------------------------------------------------  
                                                                                
Predicate Information (identified by operation id):                             
---------------------------------------------------                             
                                                                                
   1 - access("NAME"='vogts')                                                   
       filter("NAME"='vogts')                                                   

SQL> spool off;
测试结果告诉我们,如果我建的索引为(A,B)那么,查询条件中,至少要有A,才走索引,否则要走全表扫描。
d)        NULL VALUES
如果索引列中含有NULL值,则不走索引。因为NULL在索引里是不起作用的。你想想索引本身存的就是值和ROWID,这个值就没了,谈什么ROWID?对不?
如果在查询中,条件为 a is null,那么务必将会引起全表扫描!所以在开发人员中,请谨慎使用该条件。
e)        REVERSE INDEX
反向索引。比如普通索引存的是VOGTS,那么反向索引存的是STGOV,reverse索引的优点就是在,当索引存储的非常不合理的时候,使用reverse index则比较有效。不过一般在index rebuild以后应该没什么问题;
f)        BASED FUNCTION INDEX
索引函数的作用就是,当在查询条件加上函数的时候,还使查询条件继续走索引;

2.        BITMAP索引
位图索引主要是对类别类字段建的索引,若键值超过1000种以后,该索引的效率会明显下降!
其他说明类似B-TREE索引;

3.        索引组织表
索引组织表(OIT organization index table),将表看做是一个索引。普通索引只存储索引类,索引组织表则存储了该表的所有数据。如果该表有额外数据,只是这个BLOCK上挂了别的数据;

4.        CLUSTERING
簇索引。这个我个人的理解就是多张表共用一个索引。没实际测试过。

抱歉!评论已关闭.