十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
4.位图索引的缺点(其它资料),也不好说是缺点
bitmap的存储结果相对来说,复杂一点。bitmap不存储rowid,rowid存储在每一个bitmap的头部,都存储了rowid的启示位置与结束位置。ORACLE通过自己的内部算 法,算出来相应的ROWID。
位图中的每一位,都记录是否有值。如表的记录是这样存储的:
row-value |
male |
female |
female |
male |
那么对应的bitmap则是这样存储的:
rowid的启示位置与结束位置 | rowid的启示位置与结束位置 |
male | female |
1 | 0 |
0 | 1 |
0 | 1 |
1 | 0 |
由 此可见,存储的空间大大的节省了,另外带来的收益就是扫描的BLOCK也大大减少了。
如果查找性别是male的数据,ORACLE只会去 搜索MALE这一列,然后是1的记录,返回即可。
如果是针对BITMAP字段本身做OR,AND这样的查询,那么ORACLE会在BITMAP索引内部,先做一次判断,找出符合结果的,再去计算ROWID,最后给出相应的VALUE,示意图如下:
bitmap join index
bitmap join index,它的特点就是将多张表的JOIN结果,存储在一个索引里面,然后使用BITMAP的形式进行存储。这个对于类似DW那样的多表join效率提高很明显。
做用3张表join来做测试如下,原来的SQL是这样的:
test@DB>select wt_cust.company_name,wt_cust.gmt_create
2 from wt_cust,wt_CUST_EXT ,wt_CUST_BOOK
3 where wt_cust.id=wt_CUST_EXT.Cust_Id
4 and wt_CUST_BOOK.Cust_Id=wt_cust.id;
58 rows selected.
Elapsed: 00:00:00.01
Execution Plan
———————————————————-
—————————————————————————————————-
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|
—————————————————————————————————-
| 0 | SELECT STATEMENT | | 54 | 2484 | 179 (0)|
| 1 | NESTED LOOPS | | 54 | 2484 | 179 (0)|
| 2 | NESTED LOOPS | | 177 | 7257 | 179 (0)|
| 3 | INDEX FULL SCAN | wt_CUST_BOOK_UK | 177 | 1062 | 1 (0)|
| 4 | TABLE ACCESS BY INDEX ROWID| wt_CUST | 1 | 35 | 2 (0)|
|* 5 | INDEX UNIQUE SCAN | wt_CUST_PK | 1 | | 1 (0)|
|* 6 | INDEX RANGE SCAN | wt_CUST_EXT_CID_IND | 1 | 5 | 0 (0)|
—————————————————————————————————-
一 个3表join,效率很差。如果我们创建BITMAP JOIN INDEX则可以避免这种情况的发生:
test@DB>CREATE BITMAP INDEX cust_wt_test
2 ON wt_cust(wt_cust.company_name)
3 FROM wt_cust,wt_CUST_EXT ,wt_CUST_BOOK
4 WHERE wt_cust.id=wt_CUST_EXT.Cust_Id
5 and wt_CUST_BOOK.Cust_Id=wt_cust.id
6 tablespace test_ind ;
Index created.
Elapsed: 00:00:00.08
再来看看SQL的执行计划:
xx@DB>select wt_cust.company_name,wt_cust.gmt_create
2 from wt_cust,wt_CUST_EXT ,wt_CUST_BOOK
3 where wt_cust.id=wt_CUST_EXT.Cust_Id
4 and wt_CUST_BOOK.Cust_Id=wt_cust.id;
58 rows selected.
Elapsed: 00:00:00.00
Execution Plan
———————————————————-
—————————————————————————————
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|
—————————————————————————————
| 0 | SELECT STATEMENT | | 1834K| 61M| 219K (1)|
| 1 | TABLE ACCESS BY INDEX ROWID | wt_CUST | 1834K| 61M| 219K (1)|
| 2 | BITMAP CONVERSION TO ROWIDS| | | | |
| 3 | BITMAP INDEX FULL SCAN | CUST_WT_TEST | | | |
—————————————————————————————
请 着重注意红色部分。逻辑读大大降低!!