服务器 频道

降序索引和位图索引的结构分析

  【IT168 服务器学院】降序索引
  
  降序索引是8i里面新出现的一种索引,是B*Tree的另一个衍生物,它的变化就是列在索引中的储存方式从升序变成了降序,在某些场合下降序索引将会起作用。举个例子,我们来查询一张表并进行排序:
  
  SQL> select * from test where a between 1 and 100 order by a desc,b asc;
  
  已选择100行。
  
  Execution Plan
  ----------------------------------------------------------
  0  SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=100 Bytes=400)
  1 0 SORT(ORDER BY)(Cost=2 Card=100 Bytes=400)
  2 1 INDEX (RANGE SCAN) OF ''IND_BT'' (NON-UNIQUE) (Cost=2 Card=100 Bytes=400)
  
  这里优化器首先选择了一个索引范围扫描,然后还有一个排序的步骤。如果使用了降序索引,排序的过程会被取消。
  
  SQL> create index test.ind_desc on test.testrev(a desc,b asc);
  
  索引已创建。
  
  SQL> analyze index test.ind_desc compute statistics;
  
  索引已分析
  
  再来看下执行路径:
  
  SQL> select * from test where a between 1 and 100 order by a desc,b asc;
  
  已选择100行。
  
  Execution Plan(SQL执行计划,稍后会讲解如何使用)。
  ----------------------------------------------------------
  0  SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=100 Bytes=400)
  
  1 0 INDEX (RANGE SCAN) OF ''IND_DESC'' (NON-UNIQUE) (Cost=2 Card=100 Bytes=400)
  
  我们看到排序过程消失了,这是因为创建降序索引时Oracle已经把数据都按降序排好了。
  
  另外一个需要注意的地方是要设置init.ora里面的compatible参数为8.1.0或以上,否则创建时desc关键字将被忽略。
  
  位图索引
  
  位图索引主要用于决策支持系统或静态数据,不支持行级锁定。位图索引最好用于低cardinality列(即列的唯一值除以行数为一个很小的值,接近零),例如又一个“性别”列,列值有“Male”,“Female”,“Null”等3种,但一共有300万条记录,那么3/3000000约等于0,这种情况下最适合用位图索引。
  
  位图索引可以是简单的(单列)也可以是连接的(多列),但在实践中绝大多数是简单的。在这些列上多位图索引可以与AND或OR操作符结合使用。位图索引使用位图作为键值,对于表中的每一数据行位图包含了TRUE(1)、FALSE(0)、或NULL值。位图索引的位图存放在B-Tree结构的页节点中。B-Tree结构使查找位图非常方便和快速。另外,位图以一种压缩格式存放,因此占用的磁盘空间比B-Tree索引要小得多。位图索引的格式如表26-1所示。
  
  表26-1 位图索引的格式
  行
  值 1 2 3 4 5 6 7 8 9 10
  Male 1 0 0 0 0 0 0 0 1 1
  Female 0 1 1 1 0 0 1 1 0 0
  Null 0 0 0 0 1 1 0 0 0 0
  
  如果搜索where gender=’Male’,要统计性别是”Male”的列行数的话,Oracle很快就能从位图中找到共3行即第1,9,10行是符合条件的;如果要搜索where gender=’Male’ or gender=’Female’的列的行数的话,也很容易从位图中找到共8行即1,2,3,4,7,8,9,10行是符合条件的。如果要搜索表的值的话,那么Oracle会用内部的转换函数将位图中的相关信息转换成rowid来访问数据块。
0
相关文章