日期:2014-05-16  浏览次数:20505 次

Oracle索引的新认识

首先,Oracle的索引有。

普通索引B*树,BitMap索引,函数索引,组合索引,反转索引。

?

那么这里主要说一下常用的索引。

B*树索引就是普通索引。

使用方式如下:

create index idx_a on my_table(a);

?

B*树的组合索引用法如下:

create index idx_a_b on my_table(a,b);

?组合索引是普通索引的一种扩充。

每次查询,CBO会选择其中的一条索引进行查询。

所以即使建立了多个单列索引,也只是会选择一条进行使用。

?

注意,组合索引的前后顺序会有很大的差异。

按照上面的组合索引来说,如果是这种情况:

select * from my_table
where a = *

?

是可以走 idx_a_b这个索引的。

但是,相对,如果是:

select * from my_table
where b= *

?

则不会走idx_a_b这个索引了。

所以在使用组合索引的时候,一定要注意前后的顺序。

?

索引也是占用表空间的,至于占了多少,是可以查的到的。

--(1)查看索引段中extent的数量:
select segment_name, count(*)
  from dba_extents
 where segment_type = 'INDEX'
   and owner = UPPER('&owner') --schema 名
 group by segment_name

--(2)查看索引段中的block的数量:
select segment_name, sum(blocks)
  from dba_extents
 where segment_name = 'SYS_C005736' --对象名
 group by segment_name;
 


?

Oracle为数据库中的所有数据分配逻辑结构空间。
数据库空间的单位是数据块(block)、范围(extent)和段(segment)。

?

Oracle数据块(block)是Oracle使用和分配的最小存储单位。
它是由数据库建立时设置的DB_BLOCK_SIZE决定的。一旦数据库生成了,数据块的大小不能改变。
要想改变只能重新建立数据库。(在Oracle9i中有一些不同,不过这不在本文讨论的范围内。)

?

Extent是由一组连续的block组成的。
一个或多个extent组成一个segment。
当一个segment中的所有空间被用完时,Oracle为它分配一个新的extent。

Segment是由一个或多个extent组成的。它包含某表空间中特定逻辑存储结构的所有数据。

一个段中的extent可以是不连续的,甚至可以在不同的数据文件中。
一个object只能对应于一个逻辑存储的segment,
我们通过查看该segment中的extent,可以看出相应object的存储情况。

?

面对一些海量数据表,选择适合的索引可以降低存储大小,降低成本,也能够提高查询效率。