【DB笔试面试552】在Oracle中,位图连接索引是什么?

  • 2019 年 10 月 10 日
  • 笔记

题目部分

在Oracle中,位图连接索引是什么?

答案部分

位图连接索引(Bitmap Join Indexes)是建立在两个或更多表的连接之上的位图索引。对于表列中的每个值,索引存储被索引表中的相应行的ROWID。相比之下,在标准位图索引中,索引是建立在一个表上的。在数据仓库环境中使用这种索引可以改进连接维度表和事实表的查询性能。创建位图连接索引时,标准方法是连接索引中常用的维度表(Dimension)和事实表(Fact)。当用户在一次查询中结合查询事实表和维度表时,就不需要执行连接,因为在位图连接索引中已经有可用的连接结果。通过压缩位图连接索引中的ROWID可以进一步改进性能,并且减少访问数据所需的I/O数量。位图连接索引,就是将事实表和维度表的ROWID提前进行映射,省去了连接时的开销。

位图连接索引有如下几点限制:

① 只可以索引维度表中的列。

② 用于连接的列必须是维度表中的主键或唯一约束;如果是复合主键,那么必须使用连接中的每一列。

③ 不可以对索引组织表创建位图连接索引,并且适用于常规位图索引的限制也适用于位图连接索引。

在创建位图连接索引时,相应的语法形式如下所示:

CREATE BITMAP INDEX FACT_DIM_COL_IDX  ON FACT(DIM.DESCR_COL)  FROM FACT, DIM  WHERE FACT.JOINCOL = DIM.JOINCOL;  

位图连接的语法比较特别,其中包含FROM子句和WHERE子句,并且引用两个单独的表。索引列通常是维度表中的描述列。

下面的SQL语句可以找出所有的位图连接索引:

SELECT * FROM DBA_INDEXES D WHERE D.JOIN_INDEX='YES';  

通过视图DBA_JOIN_IND_COLUMNS可以查看位图连接索引的详细信息。

假定用户经常查询某种特定职位类型的雇员数。一个典型的查询可能如下所示:

SELECT COUNT(*)    FROM HR.EMPLOYEES, HR.JOBS   WHERE EMPLOYEES.JOB_ID = JOBS.JOB_ID     AND JOBS.JOB_TITLE = 'Accountant';  

上述查询通常使用JOBS.JOB_TITLE上的一个索引来检索职位表中的Accountant行,然后通过相同列JOB_ID,和员工表中EMPLOYEES.JOB_ID列上的索引来找到匹配的行。如果想要从索引本身检索数据,而不是从表中扫描获取数据,那么可以创建一个位图联接索引,如下所示:

CREATE BITMAP INDEX EMPLOYEES_BM_IDX  ON HR.EMPLOYEES(HR.JOBS.JOB_TITLE)  FROM HR.EMPLOYEES,HR.JOBS  WHERE HR.EMPLOYEES.JOB_ID=HR.JOBS.JOB_ID;  

索引键是JOBS.JOB_TITLE,而被索引的表是EMPLOYEES。

本文选自《Oracle程序员面试笔试宝典》,作者:李华荣。