oracle中各种索引的总结
[code]

索引在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
簇索引,这个不太常用,没有测试过。
[/code]

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: oracle