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