最近一直在看ORACLE SQL-TUNNING方面的东西,一直想对索引做一个总结。
索引在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
簇索引。这个我个人的理解就是多张表共用一个索引。没实际测试过。[@more@]
索引在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
簇索引。这个我个人的理解就是多张表共用一个索引。没实际测试过。[@more@]
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/202714/viewspace-903530/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/202714/viewspace-903530/