oracle map操作,ORACLE BITMAP概要及简单实验

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,示意图如下:

30208428_1444289696Hga7.gif

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      |       |       |            |

—————————————————————————————

请 着重注意红色部分。逻辑读大大降低!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值