oracle 索引(2)

发表于:2013-08-08来源:博客园作者:虫师点击数: 标签:oracle
ID SE NAME ---------- -- -------------------- 24 M chongshi 25 M chongshi 26 M chongshi 27 M chongshi 28 M chongshi 29 M chongshi 30 M chongshi 31 M chongshi 8 rows selected. 如上面查找的列子,

  ID SE NAME

  ---------- -- --------------------

  24 M chongshi

  25 M chongshi

  26 M chongshi

  27 M chongshi

  28 M chongshi

  29 M chongshi

  30 M chongshi

  31 M chongshi

  8 rows selected.

复制代码

  如上面查找的列子,通过索引的方式先找到第23条数据,再找到第32条数据,这样就能快速的锁定一个查找的范围,如果每条数据都要从根节点开始查找的话,那么效率就会非常低下。

  位图索引

  位图索引主要针对大量相同值的列而创建。拿全国居民登录一第表来说,假设有四个字段:姓名、性别、年龄、和身份证号,年龄和性别两个字段会产生许多相同的值,性别只有男女两种值,年龄,1到120(假设最大年龄120岁)个值。那么不管一张表有几亿条记录,但根据性别字段来区分的话,只有两种取值(男、女)。那么位图索引就是根据字段的这个特性所建立的一种索引。

  Bitmap Index

  从上图,我们可以看出,一个叶子节点(用不同颜色标识)代表一个key , start rowid 和 end rowid规定这种类型的检索范围,一个叶子节点标记一个唯一的bitmap值。因为一个数值类型对应一个节点,当时行查询时,位图索引通过不同位图取值直接的位运算(与或),来获取到结果集合向量(计算出的结果)。

  举例讲解:

  假设存在数据表T,有两个数据列A和B,取值如下,我们看到A和B列中存在相同的数据。

  对两个数据列A、B分别建立位图索引:idx_t_bita和idx_t_bitb。两个索引对应的存储逻辑结构如下:

  Idx_t_bita索引结构,对应的是叶子节点:

  Idx_t_bitb索引结构,对应的是叶子节点:

  对查询“select * from t where b=1 and (a=’L’ or a=’M’)”

  分析:位图索引使用方面,和B*索引有很大的不同。B*索引的使用,通常是从根节点开始,经过不断的分支节点比较到最近的符合条件叶子节点。通过叶子节点上的不断Scan操作,“扫描”出结果集合rowid。

  而位图索引的工作方式截然不同。通过不同位图取值直接的位运算(与或),来获取到结果集合向量(计算出的结果)。

  针对实例SQL,可以拆分成如下的操作:

  1、a=’L’ or a=’M’

  a=L:向量:1010

  a=M:向量:0001

  or操作的结果,就是两个向量的或操作:结果为1011。

  2、结合b=1的向量

  中间结果向量:1011

  B=1:向量:1001

  and操作的结果,1001。翻译过来就是第一和第四行是查询结果。

  3、获取到结果rowid

  目前知道了起始rowid和终止rowid,以及第一行和第四行为操作结果。可以通过试算的方法获取到结果集合rowid。

  位图索引的特点:

  1.Bitmap索引的存储空间节省

  2.Bitmap索引创建的速度快

  3.Bitmap索引允许键值为空

  4.Bitmap索引对表记录的高效访问

  创建位图索引:

复制代码

  查看表记录

  SQL> select * from dex;

  ...................

  ID SEX NAME

  ---------- -- --------------------

  991 M chongshi

  992 M chongshi

  993 G chongshi

  994 G chongshi

  995 G chongshi

  996 M chongshi

  997 G chongshi

  998 G chongshi

  999 G chongshi

  1000 M chongshi

  1000 rows selected.

  对于上面表来说sex(性别)只有两种值,最适合用来创建位图所引

  创建索引:

  SQL> create bitmap index my_bit_idx on dex(sex);

  Index created.

  查看创建的所引

  SQL> select object_name,object_type from user_objects;

  OBJECT_NAME OBJECT_TYPE

  --------------------------------------------------------------------------------

  MY_BIT_IDX INDEX

复制代码

  创建索引的一些规则

  1、权衡索引个数与DML之间关系,DML也就是插入、删除数据操作。

  这里需要权衡一个问题,建立索引的目的是为了提高查询效率的,但建立的索引过多,会影响插入、删除数据的速度,因为我们修改的表数据,索引也要跟着修改。这里需要权衡我们的操作是查询多还是修改多。

  2、把索引与对应的表放在不同的表空间。

  当读取一个表时表与索引是同时进行的。如果表与索引和在一个表空间里就会产生资源竞争,放在两个表这空就可并行执行。

  3、最好使用一样大小是块。

  Oracle默认五块,读一次I/O,如果你定义6个块或10个块都需要读取两次I/O。最好是5的整数倍更能提高效率。

原文转自:http://www.cnblogs.com/fnng/archive/2012/10/10/2719221.html