背景:

按照《Oracle Concept》的结构一起了解Oracle数据库,这是学习Oracle从入门到精通的基础。

前言《Introduction to Oracle Database》的历史文章

第二章《Tables and Table Clusters》 历史文章

第三章《Indexes and Index-Organized Tables》历史文章:

本文主题第三章《Indexes and Index-Organized Tables》 - Overview of Indexes。

单表位图索引

如下示例展示了对表sh.customers的检索。这张表的一些列上很适合创建位图索引。

SQL> SELECT cust_id, cust_last_name, cust_marital_status, cust_gender
  2  FROM   sh.customers 
  3  WHERE  ROWNUM < 8 ORDER BY cust_id;

   CUST_ID CUST_LAST_ CUST_MAR C
---------- ---------- -------- -
         1 Kessel              M
         2 Koch                F
         3 Emmerson            M
         4 Hardy               M
         5 Gowen               M
         6 Charles    single   F
         7 Ingram     single   F

7 rows selected.

cust_marital_status和cust_gender列的重复值很少,而cust_id和cust_last_name列的重复值很多。因此cust_marital_status和cust_gender列很适合创建位图索引。如果在其他列上创建位图索引,可能不会有作用。取而代之的是,在这些重复值很高的列上,创建一个唯一的B树索引,可能会更有利于数据的检索性能。

表3-2展示了cust_gender列的位图索引。他包含了两个独立的位图,每个位代表了一个性别。

Table 3-2 位图示例

映射函数会将位图中的每个位转换成customers表的一个rowid。每个位的值依赖于表中相应行的取值。例如,M值的位图含有1作为第一个位,因为在customers表中的第一行性别是M。位图cust_gender='M'将用0作为第2、6和7行的位,因为这些行的值不是M。

注意:

不像B树索引,位图索引能包含那些完全是NULL空值的键。对空值索引对一些SQL语句来说可能会是有用的,例如使用COUNT聚合函数的检索。

一个调查顾客统计趋势的分析员可能会问,“有多少女性顾客是单身或者离异?”这个问题能用如下的SQL检索:

SELECT COUNT(*)
FROM   customers
WHERE  cust_gender = 'F'
AND    cust_marital_status IN ('single', 'divorced');

如同表3-3所示,位图索引能在结果集位图中对值是1的值进行统计来有效地处理这个查询。为了明确哪些顾客满足条件,Oracle会使用结果集位图来访问这张表。

表3-3,位图索引示例

位图索引能有效地合并WHERE条件中不同条件对应的索引。访问表之前,会过滤掉那些只满足部分条件,或者完全不满足条件的行。这个技术通常能显著提升响应时间,毕竟是通过位计算进行的,但是一定要注意位图索引的适用条件。

09-18 01:38