位图连接索引

2.1 明确需求后使用位图索引
在创建位图连接索引时,它是两个表或多个表之间的索引值的连接,连接的结果存储在索引自身中;通过前期做连接并存储结果,当查询时通过扫描索引(避免两表或多表全表扫描)来获取数据,当然对于建立这样的索引,建立前需求必须明确; 请观察如下人员信息表(th04)和人员单位关系信息表(tbbsj)
人员信息表(th04)
行  ID         NAME   GENDER   IDCARD                 HOMEADDR   JOBNO  BIRTHDATE
1  789524  张三      男    429005198911261805   水晶洞1     1300440   05-AUG-79
2  564895  李四    男      429005198911296178   水晶洞2     1000209   14-AUG-79
...
....
人员单位关系信息表(tbbsj)
行  ID(单位ID)    IDCARD(人员身份证)      DNAME(单位名称)    JOINDATE(进入单位时间)     SRZW(所任职位)    GZZT(工作状态)    TSGX(特殊贡献)
1  785652       429005198911261805    太空建筑有限公司       2013-12-22 21:51:33           总经理助理             优                          暂无
2  5689556   429005198911296178     飞轮实业有限公司         2013-12-22 21:51:42          总经理小秘            良                           暂无
..
.....
已知人员信息数据量为:100万,人员单位关系信息数据量为:1106642,在建立普通索引的情况下获取人员IDCARD为:429005198911261805 的人员单位信息:
SQL> select t1.*,t2.* from th04 t1,tbbsj t2 
2 where t1.idcard=t2.idcard and t1.idcard=‘429005198911261805‘;
---------------------------------------------------------------------------------------------- 
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop | 
---------------------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT | | 1 | 253 | 10959 (1)| 00:02:12 | | | 
|* 1 | HASH JOIN | | 1 | 253 | 10959 (1)| 00:02:12 | | | 
| 2 | PARTITION RANGE ALL| | 1 | 65 | 2661 (1)| 00:00:32 | 1 | 6 | 
|* 3 | TABLE ACCESS FULL | TH04 | 1 | 65 | 2661 (1)| 00:00:32 | 1 | 6 | 
|* 4 | TABLE ACCESS FULL | TBBSJ | 1 | 188 | 8297 (1)| 00:01:40 | | | 
---------------------------------------------------------------------------------------------- 
Predicate Information (identified by operation id): 
--------------------------------------------------- 
1 - access("T1"."IDCARD"="T2"."IDCARD") 
3 - filter("T1"."IDCARD"=‘429005198911261805‘) 
4 - filter("T2"."IDCARD"=‘429005198911261805‘) 
Statistics 
---------------------------------------------------------- 
1 recursive calls 
0 db block gets 
40165 consistent gets 
40137 physical reads 
分析结果得知为获取IDCARD为: 429005198911261805的人员单位信息,两张大表都做了全表扫描;因为获得人员单位关系信息需求已经明确,为其创建位图连接索引:
SQL> create bitmap index ind_th04uniontbbsj on th04(t1.idcard) 
2 from th04 t1,tbbsj t2 
3 where t1.idcard=t2.idcard 
4 tablespace tbs03 
5* local ;
创建位图连接索引后再次查询:
SQL> select t1.*,t2.* from th04 t1,tbbsj t2 
2* where t1.idcard=t2.idcard and t1.idcard=‘429005198911261805‘;
----------------------------------------------------------------------------------------------------------------- 
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop | 
----------------------------------------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT | | 1 | 253 | 5 (0)| 00:00:01 | | | 
| 1 | NESTED LOOPS | | 1 | 253 | 5 (0)| 00:00:01 | | | 
| 2 | TABLE ACCESS BY INDEX ROWID | TBBSJ | 1 | 188 | 3 (0)| 00:00:01 | | | 
|* 3 | INDEX UNIQUE SCAN | PK_IDCARD | 1 | | 2 (0)| 00:00:01 | | | 
| 4 | TABLE ACCESS BY GLOBAL INDEX ROWID| TH04 | 1 | 65 | 2 (0)| 00:00:01 | ROWID | ROWID | 
|* 5 | INDEX UNIQUE SCAN | CS_IDCARD | 1 | | 1 (0)| 00:00:01 | | | 
----------------------------------------------------------------------------------------------------------------- 
Predicate Information (identified by operation id): 
--------------------------------------------------- 
3 - access("T2"."IDCARD"=‘429005198911261805‘) 
5 - access("T1"."IDCARD"=‘429005198911261805‘) 
Statistics 
---------------------------------------------------------- 
0 recursive calls 
0 db block gets 
3 consistent gets 
0 physical reads 
对于位图连接索引,它将主导表和关联表中的ROWID以及主导列的列值存储在索引中,查询数据时通过扫描索引提高查询效率:
人员信息表(TH04)ROWID     人员单位关系信息表(tbbsj)ROWID     IDCARD
AAASdEAAGAAB6w6AAY       AAASfXAAIAAAmCQAAE                    440621197102274116
AAASdEAAGAAB6z5AAf        AAASfXAAIAAAmCGAAX                     440621197311244423
AAASdEAAGAAB6zCAAl        AAASfXAAIAAAmCPAAW                    440621197405202427

2.2创建位图连接索引的注意事项:
2.2.1创建位图连接索引时WHERE 子句中的关联条件列必须是主键或唯一约束(不符合条件会报错ORA-25954: missing primary key or unique constraint on dimension);
2.2.2在指定索引列时,如果两表都具有相同列,必须使用表名.列名的方式指定或者别名.列名的方式指定(不符合条件会报错:ORA-00918: column ambiguously defined);
2.2.3 创建位图索引同样DML操作效率差,建立前请仔细分析表结构和数据DML操作率;
2.2.4 更新表数据时同样会有锁定主导表、关联表问题;

位图连接索引

时间: 2024-08-03 20:25:08

位图连接索引的相关文章

数据库使用-oracle位图索引

我们目前大量使用的索引一般主要是B*Tree索引,在索引结构中存储着键值和键值的RowID,并且是一一对应的.而位图索引主要针对大量相同值的列而创建(例如:类别,操作员,部门ID,库房ID等),索引块的一个索引行中存储键值和起止Rowid,以及这些键值的位置编码,位置编码中的每一位表示键值对应的数据行的有无.一个块可能指向的是几十甚至成百上千行数据的位置.这种方式存储数据,相对于B*Tree索引,占用的空间非常小,创建和使用非常快. 位图索引的目标是为用户提供指向包含特定键值(key value

Oracle 位图索引

内容简介: 1.位图索引 1.1位图索引使用注意事项; 1.2 使用位图索引; 1.3 位图索引对DML操作的影响; 2.位图连接索引 2.1 明确需求后使用位图索引; 2.1创建位图连接索引的注意事项: 1.位图索引: 1.1位图索引使用注意事项: ? 一般适用于低基数列; ? 适合数据仓库; ? 对于启用位图索引的表,应尽量减少或避免DML操作; ? 如果对一张含有多列位图索引的表进行大量DML操作,应考虑将位图索引删除,DML操作结束后重建位图索引; ? 不适用于频繁持续发生DML操作的O

【转载】oracle索引详解2

原文URL:http://justplayoop1.iteye.com/blog/1259562 一. 索引介绍 1.1  索引的创建 语法 : CREATE UNIUQE | BITMAP INDEX <schema>.<index_name> ON <schema>.<table_name> (<column_name> | <expression> ASC | DESC,                <column_na

oracle索引类型

逻辑上: Single column 单行索引 Concatenated 多行索引 Unique  NonUnique 非 Function-based函数索引 Domain 域索引   物理上: Partitioned 分区索引 NonPartitioned 非分区索引 B-tree: Normal 正常型B树 Rever Key 反转型B树  Bitmap Oracle提供了大量索引选项.知道在给定条件下使用哪个选项对于一个应用程序的性能来说非常重要.一个错误的选择可能会引发死锁,并导致数据

论索引的重要性

1.以前虽然知道索引可以优化查询速度.但是一直没有怎么重视.所以建表的时候也基本不会太多考虑索引的事. 2.至从遇到一张有50多万条数据的表里查数据 select m.miid from MemberInfo  m  where m.userid=301212 起先这个where 条件的userid字段 是没有加索引的.执行时间11秒左右. 3.加上索引之后.该语句执行时间0.016秒,这速度的提升是相当可怕的. 这次的经历让我重新认识了索引的重要性.再次记录 以下附数据库查询优化 ------

Oracle 索引(转)

一.索引介绍 1.1 索引的创建语法: CREATE UNIUQE | BITMAP INDEX <schema>.<index_name> ON <schema>.<table_name> (<column_name> | <expression> ASC | DESC, <column_name> | <expression> ASC | DESC,...) TABLESPACE <tablespac

oracle 索引基本原理

一.索引基本概念 oracle提供了两种方式:从表中读取所有行(即全表扫描),或者通过ROWID一次读取一行. 如果只访问大数据量表中的5%的行,并且使用索引标识需要读取的数据块,这样话费的I/O较少. 索引对性能改进的程度:1.取决于数据的选择性 2.数据在表的数据块中的分布方式 当数据分散在表的多个数据块中时,最好是不使用索引,而是选择全表扫描.执行全表扫描时,oracle使用多块读取以快速扫描表,基于索引的读是单块读.因此在使用索引时的目标是减少完成查询所需的单块读的数量. 增强索引会降低

oracle-具体索引类型解析

2.1  B树索引 (默认类型) B树索引在Oracle中是一个通用索引.在创建索引时它就是默认的索引类型.B树索引可以是一个列的(简单)索引,也可以是组合/复合(多个列)的索引.B树索引最多可以包括32列. 在下图的例子中,B树索引位于雇员表的last_name列上.这个索引的二元高度为3:接下来,Oracle会穿过两个树枝块(branch block),到达包含有ROWID的树叶块.在每个树枝块中,树枝行包含链中下一个块的ID号. 树叶块包含了索引值.ROWID,以及指向前一个和后一个树叶块

Oracle 索引 详解

一. 索引介绍 1.1  索引的创建 语法 : CREATE UNIUQE | BITMAP INDEX <schema>.<index_name> ON <schema>.<table_name> (<column_name> | <expression> ASC | DESC,               <column_name> | <expression> ASC | DESC,...)      T