日期:2014-05-16 浏览次数:20538 次
首先,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的存储情况。
?
面对一些海量数据表,选择适合的索引可以降低存储大小,降低成本,也能够提高查询效率。