
在Oracle中,位图连接索引是什么?
位图连接索引(Bitmap Join Indexes)是建立在两个或更多表的连接之上的位图索引。对于表列中的每个值,索引存储被索引表中的相应行的ROWID。相比之下,在标准位图索引中,索引是建立在一个表上的。在数据仓库环境中使用这种索引可以改进连接维度表和事实表的查询性能。创建位图连接索引时,标准方法是连接索引中常用的维度表(Dimension)和事实表(Fact)。当用户在一次查询中结合查询事实表和维度表时,就不需要执行连接,因为在位图连接索引中已经有可用的连接结果。通过压缩位图连接索引中的ROWID可以进一步改进性能,并且减少访问数据所需的I/O数量。位图连接索引,就是将事实表和维度表的ROWID提前进行映射,省去了连接时的开销。
位图连接索引有如下几点限制:
① 只可以索引维度表中的列。
② 用于连接的列必须是维度表中的主键或唯一约束;如果是复合主键,那么必须使用连接中的每一列。
③ 不可以对索引组织表创建位图连接索引,并且适用于常规位图索引的限制也适用于位图连接索引。
在创建位图连接索引时,相应的语法形式如下所示:
1CREATE BITMAP INDEX FACT_DIM_COL_IDX
2ON FACT(DIM.DESCR_COL)
3FROM FACT, DIM
4WHERE FACT.JOINCOL = DIM.JOINCOL;
位图连接的语法比较特别,其中包含FROM子句和WHERE子句,并且引用两个单独的表。索引列通常是维度表中的描述列。
下面的SQL语句可以找出所有的位图连接索引:
1SELECT * FROM DBA_INDEXES D WHERE D.JOIN_INDEX='YES';
通过视图DBA_JOIN_IND_COLUMNS可以查看位图连接索引的详细信息。
假定用户经常查询某种特定职位类型的雇员数。一个典型的查询可能如下所示:
1SELECT COUNT(*)
2 FROM HR.EMPLOYEES, HR.JOBS
3 WHERE EMPLOYEES.JOB_ID = JOBS.JOB_ID
4 AND JOBS.JOB_TITLE = 'Accountant';
上述查询通常使用JOBS.JOB_TITLE上的一个索引来检索职位表中的Accountant行,然后通过相同列JOB_ID,和员工表中EMPLOYEES.JOB_ID列上的索引来找到匹配的行。如果想要从索引本身检索数据,而不是从表中扫描获取数据,那么可以创建一个位图联接索引,如下所示:
1CREATE BITMAP INDEX EMPLOYEES_BM_IDX
2ON HR.EMPLOYEES(HR.JOBS.JOB_TITLE)
3FROM HR.EMPLOYEES,HR.JOBS
4WHERE HR.EMPLOYEES.JOB_ID=HR.JOBS.JOB_ID;
索引键是JOBS.JOB_TITLE,而被索引的表是EMPLOYEES。
本文选自《Oracle程序员面试笔试宝典》,作者:李华荣。

---------------优质麦课------------

详细内容可以添加麦老师微信或QQ私聊。

● 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用
● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/
● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解
● 版权所有,欢迎分享本文,转载请保留出处
● QQ:646634621 QQ群:618766405
● 提供OCP、OCM和高可用部分最实用的技能培训
● 题目解答若有不当之处,还望各位朋友批评指正,共同进步
长按下图识别二维码或微信扫描下图二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,学习最实用的数据库技术。







